我最近阅读了很多关于 IoC、DI 和服务定位器的文章,但一个问题突然出现在我的脑海中。有时 DI 使用容器来调用依赖项,对吗?但是那个容器不是服务定位器吗?
我看不出这两者有什么区别。
最佳答案
是的,在 Composition Root 之外使用或传递 DI 容器是服务定位器。根据 Mark Seemann Compositon 的定义,根是:
A Composition Root is a (preferably) unique location in an application where modules are composed together.
因此,只要您在那个唯一位置使用容器,它就不是服务定位器。
关于 Service Locator 的使用:有时您无法仅使用一个 Composition Root 来配置部分应用程序、外部库或框架。在这种情况下,您可以不使用容器,而是使用配置为仅创建预定义和有限类型资源的抽象工厂。这是 Mark Seemann "Pattern Recognition: Abstract Factory or Service Locator?" 的另一篇文章
关于design-patterns - DI 容器是服务定位器吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14014666/