我是C#程序员,我正在考虑依赖注入。我已经阅读了"Dependency injection in .NET"书籍和模式以及DI的反模式对我来说非常清楚。我大部分时间都使用模式injection in constructor
。是否有任何直接创建实例而不是使用依赖注入框架的情况?
答案 0 :(得分:3)
使用依赖注入具有使代码可测试的优势,但是滥用DI模式会使代码更难理解。举个示例this framework(ouzel,我没有任何关联。我只是喜欢它的设计方式)我最近开始关注,因为你看到大多数类都注入了依赖项,但是有仍然是没有构造函数注入sharedEngine
共享的单个实例。
在那种特殊情况下,我发现作者做了一个很好的选择,这使得代码总体上更容易理解(更简单的构造函数,更少的成员)并最终更高效(你不会在每个实例中存储共享指针)每一类发动机)。
仍然可以测试它的代码,因为你可以用mock替换那个实例(全局)(全局变量的最坏点是初始化顺序和它们的依赖关系难以跟踪,但是如果你限制为几个没有或很少的全局变量依赖性这不是问题)。如你所见,你并不总是被迫从构造函数中注入所有内容(我为C ++编写了一个DI注入框架)。
问题在于人们认为总是很好地从构造函数中注入所有内容,因此您可以开始看到允许注入所有内容的框架(例如int
或std::vector<float>
),而实际上是最糟糕的想法(事实上,在我的简单框架中,我只允许注入类)因为代码变得难以理解,因为您正在将配置值与逻辑配置混合,并且您必须浏览更多文件以掌握正在执行的代码。< / p>
因此,构造函数注入非常好,在适当的时候使用它,但它不是像编程中的所有内容的杰克,你必须不滥用它。最重要的是尝试理解每个编程实践/模式的好例子,然后推出自己的配方,编程由选择组成,每个选择都有好的和坏的。
什么时候好(和#34; OK&#34;我的意思是你仍然可以测试代码,因为它没有与具体实例相结合)来调用&#34; new&# 34;:强>
以上列表提供了即使使用DI框架(如Ninject)也可以调用&#34; new&#34;在没有删除测试代码的可能性的情况下,甚至更好,大多数情况下,在上述情况下使用DI,通常会得到更复杂的代码。