【问题标题】:Dependency injection refactoring依赖注入重构
【发布时间】:2012-10-24 03:19:52
【问题描述】:

我有这个演员:

    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 测试框架。

【问题讨论】:

  • 您在第二个示例中有重复的代码 - 您不需要第一个构造函数中的内容行。除此之外,它不是一个完全依赖注入的解决方案,但我不明白为什么代码会失败。
  • 是的,我的错,我不使用第一个 ctor 中的内容行。当我复制粘贴它时,我很着急。所以第一个 ctor 不包含任何内容。我需要一个默认构造函数,以便能够伪造 Section 类型的对象进行单元测试。

标签: c# asp.net asp.net-mvc c#-4.0 fakeiteasy


【解决方案1】:

一个问题是您的第一个构造函数,即没有参数的构造函数,委托给了第二个构造函数。换句话说,第二个将由第一个使用this() 语句中的参数调用。然而,第一个还包含_tabs_sections 的设置器,这是多余的。它应该是这样的:

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

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

不过,这是构造函数链接,这是依赖注入中使用的一种技术。这是你要问的吗?

【讨论】:

  • 是的,你是对的。我需要使用这种链接和依赖注入,以便能够伪造 Section 类型的对象。我知道我应该为 tabcollection 和 SubSectionCollection 使用接口,但这不是重点。问题是,因为在实例化 TabCollection 和 SubSectionCollection 时我有“this”这个词,所以我无法进行链接。
【解决方案2】:

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

但是,我不知道您的代码的所有细节,因此您可能希望使用工厂模式。像 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-02-12
    • 2011-09-11
    • 2019-04-20
    • 2021-05-13
    • 1970-01-01
    • 2011-02-02
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多