2014-07-09 111 views
0

我在我的解決方案中有三個層,Presentation(winforms項目),Domain(類lib)和Persistence(class lib)。 我想實現依賴注入來解耦它們。 我的應用程序根目錄位於我的表示層。 我明白在我的應用程序根目錄中應該引用DI容器(這種情況下的統一性)的唯一時間,否則我會簡單地將依賴關係替換爲我的DI容器上的類依賴關係(我認爲它仍然是輕微的更好)。依賴注入實現

因此,在考慮到這些基礎概念的情況下,我真的在爲特定實現而努力。也許我的應用程序根目錄應該在它自己的獨立項目中 - 可能是一個控制檯應用程序。然後,我可以解析第一個'overallApplication'類,在其構造函數中列出IPresentation,IDomain和IPersistence。我明白(假設實際的實現已被註冊),統一框架然後遞歸地解決所有各自的子依賴關係。

根據您的經驗 - 您是否能夠建議這是否是一種合理的方法。我真的理解解耦的概念和重要性,以及如何在高層概念上解決這個問題,但我正在努力將它們全部結合在一個具有多層的實際應用解決方案中(在VS中作爲單獨項目組織)。

任何幫助或指向正確實施的例子將不勝感激。

+0

相關:https://stackoverflow.com/questions/9501604/ioc-di-why-do-i-have-to-reference-all-layers-assemblies-in-entry-application – Steven

回答

0

希望對你有幫助的一些想法。

縱觀你的問題,你做出這樣的話:

「我真的能理解去耦的概念和重要性,以及如何通過DI解決......」

我將評估的第一件事是理解DI!= IoC容器(例如Unity)。

IoC容器用於移除由現有DI結構產生的樣板代碼。因此,我建議你不用Unity/first /重構。然後返回並添加Unity以減少代碼。

因此:
-1。通過手動Ctor,Property,Method,Service Locator注入方法進行應用Di。
-2。安裝完成後,您應該看到以下內容:

public View() { 
    var controller = new Controller(new IView(), new model(), new IService(new Dal(ISession(connectionString))), new , new ILogger(), etc.){} 
} 

-3。然後,一旦你有這樣的事情在你的代碼就可以使用統一注入所有的樂趣:

public View() {} 
Controller Controller {get;set;} //<- Unity auto builds & populates this for you with all the "new" items normally found in your constructor (or wherever). 

雖然不是生產例子,它應該給的一些步驟,以重構的想法。可以說,直奔Unity將會把車推到馬前。

+0

我有一種感覺我當我說'我真的明白'的時候,我正在離開自己。:)好的,謝謝,實際上看到依賴注入和IoC容器之間的區別很有用。 –

+0

請注意,服務定位器是最後的手段 - 您最好將多個依賴關係減少爲一個。 –