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

一个问题是您的第一个构造函数,即没有参数的构造函数,委托给第二个构造函数。换句话说,第二个将由第一个使用this()语句中的参数调用。然而,第一个还包含_tabsand的设置器_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

依赖注入并不一定意味着你的类不能在构造时实例化它的一些字段/属性。我通常将构造函数注入用于“服务”,而不是子对象的集合。

但是,我不知道您的代码的所有细节,因此您可能想要使用工厂模式。像 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 回答