什么让一个IoC容器成为IoC容器?

3

所以...我一直在研究IoC容器和服务定位器。

我认为一个IoC容器是一个IoC容器,而不是服务定位器,因为:

  1. 你使用的方式不同。你将服务定位器传递给需要依赖项的类,然后通过容器检索依赖项。另一方面,你使用IoC容器向你的类注入依赖项。

  2. IoC容器支持自动装配,而服务定位器不支持。

我一直认为IoC容器支持自动装配,并且必须支持才能被称为IoC容器,但我与一些人进行了讨论,他们告诉我IoC容器并不一定要支持自动装配。

如果这是真的,除了使用方式之外,什么使IoC容器成为IoC容器呢?

1个回答

5

DI容器是一个库,您可以以多种方式使用它:

  • 最简单的(伪)DI容器基本上只是一个增强的字典。您可以 用15行代码构建一个。但是,它不执行自动装配,这意味着它不进行组合,所以此时您只能将其用作服务定位器,但由于服务定位器是反模式,因此没有太多好处。
  • 更好的DI容器还可以执行自动装配。只要它能够执行自动装配,您也可以将其用作组合引擎。这意味着您可以仅使用与容器无关的模式(如构造函数注入)设计自己的代码,然后在组合根中请求组合引擎(DI容器)将所有内容组合在一起。
一旦 DI 容器支持自动装配,您可以在 任何情况下 使用它,但是您应该仅将其用作组合引擎。
由于服务定位器是反模式,所以这个被吹捧的字典没有价值。因此,我认为一个库必须支持自动装配才能成为 DI 容器 。但是,这仍然不能使它成为一个有价值的组件。要从 DI 容器中获得价值,它必须支持复杂的约定套路; 如果不支持,则最好手动编写组合(也称为贫民版 DI)。

3
等一下,你就是那篇介绍.NET中依赖注入的作者吗?昨晚我在研究这个主题的时候就订购了你的文章。谢谢你的写作! - Moon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接