什么使IoC容器成为IoC容器?

Moo*_*oon 3 dependency-injection inversion-of-control service-locator

那么......我一直在挖掘IoC容器和服务定位器.

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

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

  2. IoC容器支持自动布线,而服务定位器则不支持.

我一直认为IoC容器支持自动布线,它必须支持它被称为IoC容器,但我转换了一些人告诉我IoC容器不必支持自动连接.

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

Mar*_*ann 5

DI容器是一个可以以各种方式使用的库:

  • 你可以写的最简单的(伪)DI容器基本上是一个美化的字典.您可以构建15行代码中的一行.但是,它不执行自动连接,这意味着它不进行组合,因此此时您只能将其用作服务定位器,但由于服务定位器是反模式,因此没有太多好处那.
  • 更好的DI容器也可以进行自动接线.只要它可以执行自动连线,您还可以将其用作合成引擎.这意味着您可以专门设计与容器无关的模式(如构造函数注入),然后在组合根中请求组合引擎(DI容器)将所有内容组合在一起.

只要DI容器支持自动连线,您就可以以两种方式使用它,但您只能将其用作合成引擎.

由于服务定位器是反模式,因此美化字典没有价值.作为最低限度,我要说库必须支持自动接线才能成为DI容器.但是,这仍然不能成为一个有价值的组成部分.要从DI容器中获取值,它必须支持复杂的基于约定的启发式方法 ; 如果没有,你最好用手写作文(AKA Poor Man's DI).

  • 等一下......你是.net的依赖注入的作者,我昨晚在研究这个话题时订购了lol.非常感谢你的写作. (3认同)