通过构造函数或属性设置程序进行依赖注入?

我正在重构一个类并为它添加一个新的依赖关系。 该类正在构造函数中使用其现有的依赖关系。 为了保持一致性,我将该参数添加到构造函数中。
当然,在单元测试中还有几个子类加上更多,所以现在我正在玩弄改变所有构造函数匹配的游戏,这需要很长时间。
它使我认为使用setter属性是获取依赖关系的更好方法。 我不认为注入的依赖关系应该是构建类的实例的接口的一部分。 您添加一个依赖关系,现在所有用户(子类和任何直接实例化您的用户)突然知道它。 这感觉就像封装的一个突破。

这似乎不是现有代码的模式,所以我正在寻找什么是普遍的共识,建设者与属性的利弊。 是更好地使用属性设置器?


这得看情况 :-)。

如果类没有依赖关系就无法完成它的工作,那么将它添加到构造函数中。 这个类需要新的依赖关系,所以你希望你的改变打破了一切。 另外,创建一个未完全初始化的类(“两步构建”)是一种反模式(IMHO)。

如果这个类可以在没有依赖的情况下工作,那么setter就可以了。


一个类的用户应该知道给定类的依赖关系。 如果我有一个类,例如,连接到数据库,并且没有提供注入持久层依赖的方法,则用户永远不会知道与数据库的连接必须可用。 但是,如果我更改构造函数,则让用户知道持久层存在依赖关系。

此外,为了防止自己必须改变旧构造函数的每一次使用,只需将构造函数链接作为新旧构造函数之间的临时桥接。

public class ClassExample
{
    public ClassExample(IDependencyOne dependencyOne, IDependencyTwo dependencyTwo)
        : this (dependnecyOne, dependencyTwo, new DependnecyThreeConcreteImpl())
    { }

    public ClassExample(IDependencyOne dependencyOne, IDependencyTwo dependencyTwo, IDependencyThree dependencyThree)
    {
        // Set the properties here.
    }
}

依赖注入的一个要点是揭示这个类有什么依赖关系。 如果类有太多的依赖关系,那么可能是重构的时候了:类的每个方法是否都使用所有的依赖关系? 如果不是,那么这是一个很好的起点,可以看出班级在哪里可以分开。


当然,使用构造函数意味着您可以一次验证所有内容。 如果您将内容分配到只读字段中,则您可以根据构建时间确定对象的相关性。

这是一个真正的痛苦增加新的依赖,但至少这样编译器不断抱怨,直到它是正确的。 我认为这是一件好事。

链接地址: http://www.djcxy.com/p/77779.html

上一篇: Dependency injection through constructors or property setters?

下一篇: Where should objects be registered when using Windsor