2009-08-25 56 views
6

使用服務定位器與單例服務器的優缺點是什麼?我讀過單身人士是不好的,但我想知道如果服務定位器通常是一個更好的做事方式。Singleton與ServiceLocator

回答

9

這兩種方法都不好,因爲從階級契約中不明顯它的依賴是什麼。也就是說,

private void foo() 
{ 
    var x = SomeSingleton.Instance.GetX(); 
    var y = ServiceLocator.GetService<IProvider>().GetY(); 
} 

參考了SomeSingletonIProvider深埋某處內部。然而,與純單例方法相比,服務定位器通常更好,因爲它們允許更簡單的集中式配置,生命週期管理等。它們還允許更好的可測試性(您總是可以模擬調用GetService<T>),更低的耦合,關注點分離等。

+2

我會盡可能考慮這兩種反模式,但我同意服務定位器是略微可取的。最好的解決方案是實施適當的依賴注入。 – 2009-08-25 13:47:14

+0

從我對DI的理解中可以看出,是不是要求所有用來訪問單例的對象都直接引用前單例對象? – djcouchycouch 2009-08-25 13:53:45

+0

是的,您需要將它們作爲構造函數的參數(如果使用構造函數注入;通常稱爲「聲明您的依賴項」)。爲了簡化這些事情,您可以使用Inversion of Control容器。看看Google Guice。 – 2010-06-05 18:59:39

0

如果可測試性是一個問題,使用服務定位器要比純單例更好。