使用服务定位器或单例模式的优缺点是什么?我已经了解到单例模式不好,但我想知道使用服务定位器是否通常是更好的做法。
两种方法都不好,因为从类的契约中无法明确它的依赖关系。也就是说,
private void foo()
{
var x = SomeSingleton.Instance.GetX();
var y = ServiceLocator.GetService<IProvider>().GetY();
}
在某个深处引用了 SomeSingleton
和 IProvider
。
然而,与纯单例方法相比,服务定位器通常更好,因为它们允许更简单的集中配置、生命周期管理等。它们还允许更好的可测试性(您始终可以模拟对 GetService<T>
的调用)、更低的耦合度、关注点分离等。
如果测试性是一个关注点,使用服务定位器比纯单例更好。