使用服務定位器與單例服務器的優缺點是什麼?我讀過單身人士是不好的,但我想知道如果服務定位器通常是一個更好的做事方式。Singleton與ServiceLocator
6
A
回答
9
這兩種方法都不好,因爲從階級契約中不明顯它的依賴是什麼。也就是說,
private void foo()
{
var x = SomeSingleton.Instance.GetX();
var y = ServiceLocator.GetService<IProvider>().GetY();
}
參考了SomeSingleton
和IProvider
深埋某處內部。然而,與純單例方法相比,服務定位器通常更好,因爲它們允許更簡單的集中式配置,生命週期管理等。它們還允許更好的可測試性(您總是可以模擬調用GetService<T>
),更低的耦合,關注點分離等。
0
如果可測試性是一個問題,使用服務定位器要比純單例更好。
相關問題
- 1. OnSaveInstanceState與Singleton
- 2. Validation without ServiceLocator
- 3. Singleton模式與ini4j
- 4. 避免使用ServiceLocator
- 5. AS3:Singleton類與LocalConnection類
- 6. 使用JUnit測試ServiceLocator
- 7. Autofac ServiceLocator問題發佈v2.4.5.724
- 8. 匕首2 Singleton vs Real Singleton
- 9. Singleton設計與新對象裏面
- 10. 與Singleton類的實例處理
- 11. PHP Singleton模式與abstract class和interface
- 12. Singleton模式與裝飾器相結合
- 13. 數據隔離與服務和Singleton SQliteOpenHelper
- 14. 火花廣播與Singleton封裝
- 15. 建立一個Singleton特質與PHP 5.4
- 16. Singleton winform不能與Application.Run()一起顯示()
- 17. Singleton類
- 18. ThreadLocal Singleton
- 19. Singleton database.php
- 20. SqlConnection Singleton
- 21. Singleton Destructors
- 22. Singleton Inheritance
- 23. Singleton Properties
- 24. MVP:Presenter Singleton
- 25. Unity ServiceLocator,運行時註冊類型
- 26. UWP/MVVMlight:更換過時的ServiceLocator
- 27. 如何在Jersey2 ServletContainer中獲得HK2 ServiceLocator?
- 28. 使用ServiceLocator進行單元測試
- 29. 無法通過ServiceLocator找到IValidator
- 30. 如何使用泛型實現ServiceLocator?
我會盡可能考慮這兩種反模式,但我同意服務定位器是略微可取的。最好的解決方案是實施適當的依賴注入。 – 2009-08-25 13:47:14
從我對DI的理解中可以看出,是不是要求所有用來訪問單例的對象都直接引用前單例對象? – djcouchycouch 2009-08-25 13:53:45
是的,您需要將它們作爲構造函數的參數(如果使用構造函數注入;通常稱爲「聲明您的依賴項」)。爲了簡化這些事情,您可以使用Inversion of Control容器。看看Google Guice。 – 2010-06-05 18:59:39