ServiceLocator是反模式


關於ServiceLocator模式

http://www.cnblogs.com/hwade/archive/2011/01/30/CommonServiceLocator.html

為什么是Anti-Pattern

起源於同事發給我的鏈接 http://blog.ploeh.dk/2010/02/03/ServiceLocatorisanAnti-Pattern/

結合總結工作中使用ServiceLoactor模式遇到的問題。

  1. 依賴關系不明確,ServiceLoactor在各個方法中使用,無法直觀了解對象之間的引用
  2. 如果對象未正確注冊,只有執行到ServiceLoactor.Resolve時才會拋出Exception。使用構造器注入可以更早發現問題。
  3. 維護對象以及生命周期的控制。

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”,不是說它不好不能用。其實只是需要注意使用的方法。一個好東西不注意使用方式或者濫用就失去了它的意義。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM