我最近一直在阅读很多关于IoC,DI和服务定位器的内容,但是我的脑海中浮现出一个问题。 DI有时会使用容器来调用依赖项,对吧?但那个容器不是服务定位器吗?
我看不出这两者之间的区别。
答案 0 :(得分:4)
是的,在Composition Root之外使用或传递 DI容器是服务定位器。根据Mark Seemann的定义 Compositon root 是:
组合根是应用程序中(最好)唯一的位置,其中模块组合在一起。
因此,只要您在中使用容器 一个唯一的位置,它就不是服务定位器。
关于服务定位器的使用:有时您只能使用一个 Composition Root 来配置部分应用程序,外部库或框架。在这种情况下,您可以不使用容器,而是 Abstract Factory ,它们配置为仅创建预定义和有限类型的资源。这是Mark Seemann "Pattern Recognition: Abstract Factory or Service Locator?"
的另一篇文章答案 1 :(得分:2)
Container注册您的依赖项并可以解决它们。 另一方面,定位器使用容器来解析服务。
为了能够使用容器,您必须具有对它的引用。 另一方面,定位器通常是静态可用的,您不需要引用它。
Locator被认为是一个反模式,因为它可以让你解决“就地”的任何依赖,这实际上会隐含依赖。这意味着类客户端在运行时显示之前不会知道依赖关系。