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

时间:2011-08-17 20:59:50

标签: oop dependency-injection architecture

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

在我尝试使用DI时所见到的所有应用程序中,始终有两个构造函数:一个以依赖为参数的构造函数和一个没有参数的“默认”构造函数,后者又调用另一个“新近”所有的依赖,但在上述书中,这被称为“Bastard Injection anti-pattern”,这就是我曾经称之为“穷人的注射”。

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

所以我的问题是:

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

3 个答案:

答案 0 :(得分:51)

说到DI,那里的术语使用很多。 穷人的DI 这个词也不例外。对某些人而言,这意味着一件事,而对于其他人则意味着不同的东西。

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

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

至少我发现它让人放心,这本书似乎已经完成了解释穷人的DI和Bastard注射的工作,因为O.P.中给出的解释是正确的。

关于DI容器的真正好处,我将引用您的答案:Arguments against Inversion of Control containers


P.S。 2018-04-13:我想指出,我多年前就已经开始认识到,穷人的DI 这个词做了一个糟糕的(原文如此!)的沟通工作这个原则的本质,所以多年来,现在,我instead called it Pure DI

答案 1 :(得分:4)

问题的第2部分的一些注释。

  

如果您仍然需要在IoC容器中注册所有依赖项,而不是在完全相同的组合根中手动编码,那么使用IoC容器的真正好处是什么?

  • 如果你有一个依赖树(clasess依赖于依赖于其他依赖关系的依赖关系等等):你不能在组合根中做所有的“新闻”,因为你新建了实例在每个类的每个“混蛋注入”构造函数中,因此在您的代码库中传播了许多“组合根”

  • 如果您有一个依赖树,或者没有,使用IoC容器将无需键入一些代码。想象一下,你有20个不同的类依赖于相同的IDependency。如果您使用容器,则可以提供配置以让它知道要用于IDependency的实例。您将在一个地方进行此操作,容器将注意在所有依赖类中提供实例

  • 容器还可以控制对象的生命周期,这提供了另一个优势。

所有这一切,DI提供的其他明显优势(可测试性,可维护性,代码解耦,可扩展性......)

答案 2 :(得分:0)

我们发现,当重构遗留应用程序并解耦依赖关系时,通过两步过程完成操作往往会更容易。该过程包括“穷人”和正式的IoC容器系统。

首先:建立接口并建立“穷人ioc”以实现它们。

  • 这可以消除依赖关系,而不会增加开销(和学习 曲线)的正式IoC设置。
  • 这也减少了对现有遗留代码的干扰。没什么比引入另一组要调试的问题了。
  • 开发团队成员永远不会具有相同的专业知识或理解水平。这样可以节省大量的实施时间。
  • 这也为测试用例奠定了基础。
  • 这还将为以后的正式IoC容器系统建立标准。
  • 很多人可以逐步实现这一目标。

第二:每个IoC系统各有利弊。

  • 现在建立了应用标准,这是一个明智的决定 可以在选择IoC容器系统时进行。
  • 实施IoC系统成为将“穷人”代码与 新的IoC系统。
  • 这可以随着时间的推移逐步实现,也可以与“穷人”同时实现。最好由一个人负责。