2016-10-04 47 views
5
  1. 什么时候应该使用属性注入?
  2. 如果在完全控制的情况下创建实例,我应该默认使用构造函数注入吗?
  3. 我是否正确使用构造函数注入来编写容器不可知的代码?

回答

9

什么时候应该使用属性注入?

如果依赖关系是真正可选的,当您具有本地默认值或对象图包含循环依赖关系时,您应该使用属性注入。

然而,财产注入导致Temporal Coupling,并在编写业务线应用程序时,您的依赖关系不应该是可选的:您应该改为应用Null Object pattern

也不应该使用本地默认值,因为这会使测试变得复杂,隐藏依赖性,并且使得忘记配置依赖关系变得非常容易。

对象图也不应该具有循环依赖性。这是应用程序设计中的indication of a problem

我应该使用默认构造函数注入如果实例创建完全控制?

是的。建设者注入是最好的方法。它使得查看类的依赖关系变得非常容易,可以使依赖关系成为必需,并防止时间耦合。

我说得对,使用构造函数注入我写容器不可知的代码?

这是正确的。构造器注入允许您延迟决定使用哪个DI库,以及whether at all you use a DI library

针对上述情况,以及更多更详细的解释,读这本书由Mark SeemannDependency Injection in .NET(和我),这是去到引导,当谈到了解DI和它的基本模式和原则。

+0

属性注入不应该与默认构造函数结合使用,所以它应该是通过DI容器构造对象的唯一方法。所以属性注入也许可以用于当你有太多的依赖关系,你不想要一个很长的构造函数签名:) – hB0

+0

@ hB0这实际上是非常糟糕的建议。如果你有一个带有许多参数的构造函数,你的代码告诉你,你违反了单责任原则。使用属性不会解决根本问题:您的课程太大;它应该分成更小,更集中的班级。 – Steven

+0

你是对的,但它不是一个建议,但是在类已经混乱的情况下使用属性注入的合理情况,否则使用构造函数注入总是更好。这是我评论但没有回答的原因,因为这不是一个好方法。 – hB0