7

在編寫代碼時,我們應該能夠找出兩個大組對象:依賴注入,注入一個「注射」對象(服務)到newable(實體)

  • 注射劑
  • Newables

http://www.loosecouplings.com/2011/01/how-to-write-testable-code-overview.html

http://misko.hevery.com/2008/09/30/to-new-or-not-to-new/

  • 注射對象是暴露在它們的構造函數依賴這些依賴通常使用IoC容器解決對象(服務),這些對象可以只要求其他注射在它們的構造

  • Newable的對象也暴露在它們的構造,但newables依賴只能尋求其他newable對象(實體,值對象),newable對象的另一個特點是,他們不應該持有的引用可注射的對象

但在編寫代碼時,我們經常會需要「注入」一個服務器冰(注入)到一個實體(新)

我一直在想,也許暴露在一個新對象的服務依賴項更好地做它在方法級別,但這聽起來像很多工作要做....只是想着每一個方法被調用時解析依賴....嗯,這聞起來像,我們將不得不使用服務定位器反模式

我已經解決了這一問題的方法是:

  • 創建一個暴露依賴關係的方法的接口(該服務將用於此方法)

  • 爲接口創建一個擴展方法,並將其放置在不同的命名空間,也許在另一個程序集,只是包裹在調用原始的方法使用一個服務定位器

解決依賴這樣做,我們有newable和注射對象之間的一致與分離使用的服務在我們的newables容易

  • 你怎麼想的能力嗎?
  • 在擴展方法中使用服務定位器被認爲是不好的做法?
  • 你將如何單元測試擴展方法調用?
+1

密切相關:http://stackoverflow.com/questions/4835046/why-not-use-an-ioc-container-to-resolve-dependencies-for-entities-business-objec – Steven 2012-03-14 11:28:41

+0

這個鏈接真的有用 – Jupaol 2012-03-14 12:53:17

回答

2

但在編寫代碼時,我們經常需要「注入」的服務 (注射)到實體(newable)

這不是個案,如果你發現需要做到這一點,那麼應該在服務中的實體中存在一些功能。

假設您的新程序爲ShoppingCart,而您的注射器爲數據庫repository。你想能夠做到這一點:

// somehow cart already got the repository 
cart.save(); 

那麼,你做錯了。相反,你需要切換周圍的東西和做的事:

respository.save(cart); 

如果你能提供當你覺得需要這樣做的情況下,我們可以討論這種情況的細節。