"Bastard Injection"和"Poor Man's Injection"之间的真正区别是什么?

Ser*_*ero 59 architecture oop dependency-injection

从".Net中的依赖注入"一书中我知道应该在应用程序的组合根处创建对象图,这对我来说在使用IoC容器时很有意义.

在我尝试使用DI时所见到的所有应用程序中,总有两个构造函数:一个具有依赖关系作为参数的构造函数和一个没有参数的"默认"构造函数,而这些构造函数又调用另一个"newing"所有的依赖关系,但在上述书中,这被称为"混蛋注射反模式",这就是我曾经知道的"穷人的注射".

现在考虑所有这些,我会说"穷人注射"只是不使用IoC容器而是在所述组合根上手动编码所有对象图.

所以我的问题是:

  1. 我是否正确理解了这些概念,还是完全偏离了轨道?
  2. 如果您仍然需要在IoC容器中注册所有依赖项,而不是在完全相同的组合根中手动编码,那么使用IoC容器的真正好处是什么?
  3. 如果我误解了"穷人的注射"究竟是什么,有人可以澄清一下吗?

谢谢

Mar*_*ann 54

说到DI,那里有很多相互矛盾的术语.术语穷人的DI也不例外.对某些人来说,这意味着一件事,而对于其他人来说则意味着不同的东西

我想用本书做的一件事就是为DI 提供一致的模式语言.当涉及到使用冲突的所有条款时,我有两种选择:提出一个全新的术语,或者选择最普遍的用法(根据我的主观判断).

一般来说,我更喜欢重复使用现有的术语,而不是构成一种全新的(因此是外来的)模式语言.这意味着在某些情况下(例如穷人的DI),你可能对这个名称的概念与书中给出的定义有不同的概念.这通常发生在模式书籍上.

至少我发现它让人放心,这本书似乎完全解释了穷人的DI和Bastard注射,因为OP中给出的解释是现实的.

关于DI容器的真正好处,我将引用您的答案:反对控制容器的反转


PS 2018-04-13:我想指出,我多年前就已经开始认识到,穷人的DI这个词在传达原则的本质方面做得很差(原文!),所以多年来,现在,我把它称为Pure DI.

  • 那么你去,没有比作者本人更好的答案. (19认同)
  • 谢谢马克的答案和你的书.我即将开始一个绿色的田野项目,这些知识将证明是无价的! (3认同)