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

Fin*_*las 5 language-agnostic dependency-injection service-locator

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

我知道这些通常会脱离接口,因此您传入一个接口并返回一个具体的类,但我的问题仍然存在。

例如:

class Something {

    void DoSomething() {
        IMyType myType = ServiceLocator.GetSerivceTypeOf(IMyType);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里的类需要在其他地方创建的 MyType,但不是通过链向下传递 MyType(通过构造函数等...),而是以这种方式获取。

我在作为开发人员的职业生涯早期就提出了这个问题 - 在此之前我没有遇到过这种模式。安东尼已经明确了我对服务定位器的看法(因此现在是选定的答案) - 事实上,我将它们视为像其他人一样的反模式。提供的链接是一个很好的起点 - 但为了在某种程度上回答我自己的问题,它们充当全局状态,应该避免。更喜欢标准依赖注入;)

Ant*_*ony 3

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

\n\n

有关构造函数注入替代方案的更详细讨论,另请参阅问题依赖注入和服务定位器模式之间的区别是什么?

\n\n

和其他网页的单例是病态的骗子依赖注入模式

\n