用new()注入或创建实例

时间:2016-05-18 07:51:29

标签: c# dependency-injection

我是C#程序员,我正在考虑依赖注入。我已经阅读了"Dependency injection in .NET"书籍和模式以及DI的反模式对我来说非常清楚。我大部分时间都使用模式injection in constructor。是否有任何直接创建实例而不是使用依赖注入框架的情况?

1 个答案:

答案 0 :(得分:3)

使用依赖注入具有使代码可测试的优势,但是滥用DI模式会使代码更难理解。举个示例this framework(ouzel,我没有任何关联。我只是喜欢它的设计方式)我最近开始关注,因为你看到大多数类都注入了依赖项,但是有仍然是没有构造函数注入sharedEngine共享的单个实例。

在那种特殊情况下,我发现作者做了一个很好的选择,这使得代码总体上更容易理解(更简单的构造函数,更少的成员)并最终更高效(你不会在每个实例中存储共享指针)每一类发动机)。

仍然可以测试它的代码,因为你可以用mock替换那个实例(全局)(全局变量的最坏点是初始化顺序和它们的依赖关系难以跟踪,但是如果你限制为几个没有或很少的全局变量依赖性这不是问题)。如你所见,你并不总是被迫从构造函数中注入所有内容(我为C ++编写了一个DI注入框架)。

问题在于人们认为总是很好地从构造函数中注入所有内容,因此您可以开始看到允许注入所有内容的框架(例如intstd::vector<float>),而实际上是最糟糕的想法(事实上,在我的简单框架中,我只允许注入类)因为代码变得难以理解,因为您正在将配置值与逻辑配置混合,并且您必须浏览更多文件以掌握正在执行的代码。< / p>

因此,构造函数注入非常好,在适当的时候使用它,但它不是像编程中的所有内容的杰克,你必须不滥用它。最重要的是尝试理解每个编程实践/模式的好例子,然后推出自己的配方,编程由选择组成,每个选择都有好的和坏的。

什么时候好(和#34; OK&#34;我的意思是你仍然可以测试代码,因为它没有与具体实例相结合)来调用&#34; new&# 34;:

  • 您需要Polymorphis ,大​​多数情况下创建新类比使用DI框架配置更容易
  • 您需要一个对象工厂,通常是工厂本身注入,但工厂代码调用&#34; new&#34;明确地
  • 您正在呼叫&#34; new&#34;在主
  • 您正在创建的对象&#34; new&#34; 没有依赖,因此在类中使用它并不会使类更难测试(例如,您使用new创建标准.NET容器,否则会导致很多更多的困惑)
  • 您正在创建的对象是一个全局实例,它不依赖于初始化顺序,并且它的依赖关系是不可见的(只要您通过接口访问它就可以模拟实例)

以上列表提供了即使使用DI框架(如Ninject)也可以调用&#34; new&#34;在没有删除测试代码的可能性的情况下,甚至更好,大多数情况下,在上述情况下使用DI,通常会得到更复杂的代码。