A K Asked:2020-12-17 07:09:18 +0000 UTC2020-12-17 07:09:18 +0000 UTC 2020-12-17 07:09:18 +0000 UTC 穷人的 DI 和混蛋注入模式 772 我在网上看到一条评论提到了穷人的 DI 和混蛋注射模式——它们是什么,它们之间有什么区别? (任何编程语言,不一定是c#) шаблоны-проектирования 1 个回答 Voted Best Answer Pavel Mayorov 2020-12-17T18:09:08Z2020-12-17T18:09:08Z 穷人的 DI也称为Pure DI,是没有专用容器库的 DI。在使用这种方式的情况下,所有的类依赖都在其构造函数的参数或者属性中取出,并且所有的类、构造函数和属性都必须是公共的。C# 中的示例: public class Baz { private readonly IBar bar; public Baz(IBar bar) { this.bar = bar; } } 在 Composition Root 中,编写了将所有这些类收集在一起的代码——也就是说,整个对象图是手动组装的。代码是这样出来的: var foo = new Foo(); var bar = new Bar(foo); SomeFrameworkClass.SetControllerFactory(() => { // точка входа var baz = new Baz(bar); return new Controller(foo, baz); }); 纯粹形式的 Pure DI 很少使用,但如果您的类是使用 Pure DI 方法编写的,那么您可以将任何容器库附加到项目中,或随时更改它。 混蛋注入与以前的方法完全相反。在使用 Bastard Injection 的情况下,每个类都独立地从容器中提取其依赖项,并将其用作服务定位器: public class Baz { private readonly IBar bar = App.container.Resolve<IBar>(); } 这种方法的主要缺点是依赖关系分散在整个代码中。例如,如果不访问源代码,确定类需要哪些依赖项的唯一方法Baz是调用其构造函数并查看它是否遗漏了什么。而没有文档的可选依赖只能通过反编译才能找到。
穷人的 DI也称为Pure DI,是没有专用容器库的 DI。在使用这种方式的情况下,所有的类依赖都在其构造函数的参数或者属性中取出,并且所有的类、构造函数和属性都必须是公共的。C# 中的示例:
在 Composition Root 中,编写了将所有这些类收集在一起的代码——也就是说,整个对象图是手动组装的。代码是这样出来的:
纯粹形式的 Pure DI 很少使用,但如果您的类是使用 Pure DI 方法编写的,那么您可以将任何容器库附加到项目中,或随时更改它。
混蛋注入与以前的方法完全相反。在使用 Bastard Injection 的情况下,每个类都独立地从容器中提取其依赖项,并将其用作服务定位器:
这种方法的主要缺点是依赖关系分散在整个代码中。例如,如果不访问源代码,确定类需要哪些依赖项的唯一方法
Baz是调用其构造函数并查看它是否遗漏了什么。而没有文档的可选依赖只能通过反编译才能找到。