5

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

我知道这些经常运行接口,所以你传入一个接口并返回一个具体的类,但我的问题仍然存在。

例如:

class Something {

    void DoSomething() {
        IMyType myType = ServiceLocator.GetSerivceTypeOf(IMyType);
    }
}

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

在我作为开发人员的职业生涯早期,我问过这个问题——在此之前我没有遇到过这种模式。Anthony 在服务定位器上确定了我的观点(因此现在是选定的答案)——事实上,我认为它们与其他人一样是反模式。提供的链接是一个很好的起点 - 但在这么长时间之后,为了在某种程度上回答我自己的问题,它们充当全局状态,应该避免。更喜欢标准的依赖注入;)

4

3 回答 3

3

通常支持服务定位器模式的名称服务确实使用全局名称空间。

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

服务定位器不仅仅是一个全局变量,它是一种特殊化。而且这种专业化往往会减轻全局变量可能引起的许多问题。

于 2009-06-10T21:50:07.960 回答
3

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

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

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

于 2010-02-12T09:31:56.887 回答
1

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

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

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

与解决问题的讨论相比,讨论更具哲学意义。无论如何,希望它有所帮助。

于 2009-06-10T21:52:32.463 回答