2

私はこのctorを持っています:

    public Section()
    {
        _tabs = new TabCollection(this);
        _sections = new SubSectionCollection(this);
    }

私はこのようなものを取得したいと思います:

public Section()
        : this(new TabCollection(this), new SubSectionCollection(this))
    {

    }

     public Section(TabCollection tabCollection, IList<ISection> sections)
     {
         _tabs = tabCollection;
         _sections = sections;

     }

もちろん、これはうまくいきません。このコードをリファクタリングする方法について誰か提案がありますか? 単体テストでタイプ Section のオブジェクトをモックできるようにするために、これを行う必要があります。FakeItEasy テスト フレームワークを使用しています。

4

2 に答える 2

1

1つの問題は、パラメーターのない最初のコンストラクターが2番目のコンストラクターに委任することです。つまり、2番目のものは、this()ステートメント内のパラメーターを使用して最初のものによって呼び出されます。_tabsただし、最初のセッターにはとのセッターも含まれています_sectionsが、これは冗長です。次のようになります。

public Section()
    : this(new TabCollection(this), new SubSectionCollection(this))
{ }

public Section(TabCollection tabCollection, IList<ISection> sections)
{
    _tabs = tabCollection;
    _sections = sections;
}

ただし、これはコンストラクターチェーンであり、依存性注入で使用される手法です。これはあなたが求めていることですか?

于 2012-10-23T15:33:16.813 に答える
1

依存性注入は、クラスが構築時にそのフィールド/プロパティの一部をインスタンス化できないことを必ずしも意味しません。私は通常、子オブジェクトのコレクションではなく、「サービス」に対してコンストラクター注入を使用します。

ただし、コードの詳細をすべて把握しているわけではないため、Factory パターンを使用することをお勧めします。ここでは、SectionFactory のようなものが理にかなっているかもしれません...

public class Section
{
    internal Section(TabCollection tabColl, SectionCollection subSections)
    {
        // check for null, etc.

        // do whatever you need to do to finish construction
        tabColl.Parent = this;
        subSections.Parent = this;
    }
}

public class SectionFactory : ISectionFactory
{
    public Section Create()
    {
        var tabs = new TabCollection();
        var subs = new SectionCollection();

        return new Section(tabs, subs);
    }
}
于 2012-10-23T15:52:13.100 に答える