“混蛋注射”和“穷人注射”之间的真正区别是什么?
从“.NET中的dependency injection”一书中,我知道应该在应用程序的Composition Root上创build对象图,这在使用IoC容器时对我很有意义。
在所有应用程序中,当我尝试使用DI时,总会有两个构造函数:一个是依赖关系的参数,另一个是没有参数的“默认”构造函数,然后调用另一个“新build”所有的依赖关系,但在上述书中,这被称为“混蛋注入反模式”,这就是我所知道的“穷人的注射”。
现在考虑这一切,我会说,“穷人的注入”只是不使用IoC容器,而是用手在所述组合根上编码所有的对象图。
所以我的问题是:
- 我是否正确理解这些概念,还是完全偏离轨道?
- 如果仍然需要在IoC容器中注册所有依赖关系,而不是使用完全相同的Composition Root对它们进行编码,那么使用IoC容器的真正好处是什么?
- 如果我误解了“穷人注射”究竟是什么,请问有人能澄清吗?
谢谢
谈到DI,在这里有很多相互冲突的用法。 “ 穷人的DI”一词也不例外。 对某些人来说,这意味着一件事,而对另一些人则意味着不同的事物。
我想要做的一件事就是为DI提供一致的模式语言。 当谈到所有这些使用相冲突的术语时,我有两个select:提出一个全新的术语,或select最普遍的用法(根据我的主观判断)。
一般来说,我宁愿重复使用现有的术语,而不是组成一个全新的(因此是外来的)模式语言。 这意味着在某些情况下(比如“穷人的DI”),您可能会对这个名字的概念有不同的概念。 这通常发生在模式书籍上。
至less我觉得这本书似乎已经完成了解释穷人的DI和Bastard Injection的工作,因为在OP中给出的解释是现实的。
关于DI容器的真正好处,我会引用你这个答案: 控制容器反转的论据
对问题第2)部分的一些注释。
如果仍然需要在IoC容器中注册所有依赖关系,而不是使用完全相同的Composition Root对它们进行编码,那么使用IoC容器的真正好处是什么?
-
如果你有一个依赖关系树(依赖于依赖关系依赖于其他依赖关系的依赖关系等等):你不能在组合根中完成所有的“新闻”,因为你在每个“混蛋注入”每个类的构造函数,所以有很多“构图根”沿着你的代码库传播
-
如果你有一棵依赖关系树,使用一个IoC容器将无需input一些代码。 想象一下,你有20个不同的类,依赖于相同的
IDependency
。 如果您使用容器,则可以提供一个configuration,让它知道哪个实例用于IDependency
。 你将在一个地方做到这一点,容器将小心提供所有相关类的实例 -
容器也可以控制对象的生命周期,这提供了另一个优点。
除了DI(可testing性,可维护性,代码解密,可扩展性…)提供的其他明显优势之外,
- WPF MVVM为什么使用ContentControl + DataTemplate Views而不是直观的XAML Window Views?
- 我刚刚发现为什么所有的ASP.Net网站都很慢,我正在设法解决这个问题
- multithreadingC#应用程序与SQL Server数据库调用
- 工作单位+存储库模式:商业交易概念的下降
- ASP.NET MVC体系结构:ViewModel是由构成,inheritance还是重复?
- 您对“大型C ++软件devise”的看法
- ASP.NET MVC和Web服务
- 使用Resharper在Visual Studio自动格式化中断行和包装
- 当Node.js仍然依赖于内部的线程时,Node.js如何更快地运行?