Language agnostic 服务定位器不仅仅是全局变量/状态吗?

Language agnostic 服务定位器不仅仅是全局变量/状态吗?,language-agnostic,dependency-injection,service-locator,Language Agnostic,Dependency Injection,Service Locator,为了解耦代码,您可以使用服务定位器,但这与全局变量/状态不同吗 我知道这些接口经常会跑掉,所以您可以传入一个接口并返回一个具体的类,但我的问题仍然存在 例如: class Something { void DoSomething() { IMyType myType = ServiceLocator.GetSerivceTypeOf(IMyType); } } 在这里,类需要在其他地方创建的MyType,但不是通过链(通过构造函数等)传递MyType,而是以这

为了解耦代码,您可以使用服务定位器,但这与全局变量/状态不同吗

我知道这些接口经常会跑掉,所以您可以传入一个接口并返回一个具体的类,但我的问题仍然存在

例如:

class Something {

    void DoSomething() {
        IMyType myType = ServiceLocator.GetSerivceTypeOf(IMyType);
    }
}
在这里,类需要在其他地方创建的MyType,但不是通过链(通过构造函数等)传递MyType,而是以这种方式获取


在我作为开发人员的职业生涯早期,我问过这个问题——在此之前,我没有遇到过这种模式。Anthony已经将我的观点(因此现在是选择的答案)印在了ServiceLocator上——事实上,我认为他们和其他人一样是反模式的。所提供的链接是一个很好的起点——但为了在一定程度上回答我自己的问题,经过这么长时间,它们充当了全球国家的角色,应该避免。首选标准依赖项注入;)

通常备份服务定位器模式的名称服务确实使用了全局名称空间

然而,人们必须考虑“全局变量”的原因被认为是坏的。其中许多都围绕着在程序中任何地方修改全局变量的能力。但是,大多数命名服务可以限制对绑定对象的修改。对象本身可能是不可变的


服务定位器不仅仅是一个全局变量,它是一个专门化。这种专门化倾向于缓解全局变量可能产生的许多问题。

在某些时候,您需要一个具体的实现来完成一些工作。从某种意义上说,该服务是“全局的”,即它对您的应用程序是“可用的”。但您不必在代码中将其作为全局变量

你可以反驳这个论点。如果您需要访问应用程序中的服务,您将使用什么模式来访问它,而不将其绑定到具体的实现。没有太多的选择

有些资源对应用程序来说本质上是“全局的”,比如操作系统、文件系统、窗口系统等等


这场讨论比解决问题的讨论更富有哲理。无论如何,希望它能有所帮助。

是的,它们是全局变量。复杂的,但它们仍然有相同的基本缺点。因此,依赖项注入更可取

有关构造函数注入替代方案的更详细讨论,请参见问题


和其他网页和

一两个例子可能会引起一些讨论。服务定位器的主要问题是它隐藏了依赖项()。服务定位器并不能缓解这个问题。而且很难用模拟服务代替测试,除非您再次使其可变,在这种情况下,修改问题又回来了。当然,但这不是这个问题所要问的。这里的对比是全局变量和名称服务之间的对比,而不是名称服务与世界之间的对比。问题不是服务定位器是否是“最佳”模式,或者它是否优于依赖项注入。问题是它是否与全局变量相同(不是,-1),如果不是,它是否更好。如果“ServiceLocator”不是全局变量,那么它是什么?你能提供更详细讨论的链接吗。考虑这种模式的人应该知道首选的替代方案,因此链接将对此进行更详细的讨论。