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

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

这似乎不是现有代码的模式,所以我希望找出一般的共识是什么,构造函数与属性的优缺点。使用属性设置器更好吗?



侃侃无极
浏览 596回答 3
3回答

翻过高山走不出你

这要看情况 :-)。如果没有依赖项,类无法完成其工作,则将其添加到构造函数中。该类需要新的依赖项,因此您希望您的更改能够破坏事物。此外,创建一个未完全初始化的类(“两步构造”)是反模式(IMHO)。如果类可以在没有依赖项的情况下工作,那么setter就可以了。

绝地无双

一般优选的方法是尽可能多地使用构造器注入。构造函数注入准确地说明了对象正常运行所需的依赖项 - 没有什么比新建一个对象更令人讨厌,并且在调用一个方法时因为没有设置某个依赖项而使它崩溃。构造函数返回的对象应处于工作状态。尝试只有一个构造函数,它保持设计简单并避免歧义(如果不是人类,DI容器)。当你在他的书“.NET中的依赖注入”中使用Mark Seemann所称的本地默认值时,你可以使用属性注入:依赖是可选的,因为你可以提供一个很好的工作实现但是想让调用者指定一个不同的实现需要。(以下的答案)我认为如果注入是强制性的,构造函数注入会更好。如果这会添加太多构造函数,请考虑使用工厂而不是构造函数。如果注射是可选的,或者如果你想在中途改变它,那么setter注射是很好的。我一般不喜欢制定者,但这是一个品味问题。
打开App,查看更多内容
随时随地看视频慕课网APP