關於ServiceLocator模式
http://www.cnblogs.com/hwade/archive/2011/01/30/CommonServiceLocator.html
為什么是Anti-Pattern
起源於同事發給我的鏈接 http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/
結合總結工作中使用ServiceLoactor模式遇到的問題。
- 依賴關系不明確,ServiceLoactor在各個方法中使用,無法直觀了解對象之間的引用
- 如果對象未正確注冊,只有執行到ServiceLoactor.Resolve時才會拋出Exception。使用構造器注入可以更早發現問題。
- 維護對象以及生命周期的控制。
var instance1 = ServiceLocator.Current.GetInstance
var instance2 = ServiceLocator.Current.GetInstance
以上客戶端程序中出現這樣的代碼。是否 instance1 == instance2 ?
光看這段方法這是無法確定的。 導致誤解造成程序預期之外的的運行結果。甚至在其他對象中調用了ServiceLocator.Current.GetInstance
在MVC中也實現了ServiceLocator模式
//容器集成MVC
var locator = new NinjectServiceLocator(kernel);
DependencyResolver.SetResolver(locator);
//使用
var customerService = System.Web.Mvc.DependencyResolver.Current.GetService(typeof (ICustomerService));
這個對象無法在非MVC中復用運行,在單元測試時,也必須提前初始化DependencyResolver.Current
總結
標題黨了“Anti-Pattern”,不是說它不好不能用。其實只是需要注意使用的方法。一個好東西不注意使用方式或者濫用就失去了它的意義。
