1

根據依賴倒置原則,高層模塊不依賴於低層模塊,而是依賴於抽象。所以這是一種自上而下的方法。我有一個有三層的web項目。第1層包含視圖頁面和控制器以及視圖模型。第2層是服務層,第3層是存儲庫。由於Web項目是最高級別的模塊,它包含應由Service層實現的接口,Service層包含應由存儲庫實現的接口。所以Service層具有Web項目的引用,存儲庫有服務層的引用。我正在使用autofac作爲IOC Container。由於服務層實現了web項目的接口,我需要在autofac模塊中向Service層的類註冊接口,並且需要在autofac模塊中註冊服務層的接口在庫層。據我所知,我需要在應用程序啓動時註冊autofac模塊。如果我想這樣做,我需要將服務層的引用提供給Web項目,並將存儲庫層的引用提供給服務層或Web項目。但如果我想遵循DIP的自頂向下方法,它會創建循環構建依賴。 我的問題是如何註冊autofac模塊並維護DIP?DI容器模塊註冊依賴倒置原理

編輯1: 標題問題的變化,因爲我相信這將是任何DI容器

+1

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

回答

0

依賴倒置一個同樣的方法指的是依賴於相關性的圖表反轉..它並不意味着反轉程序集之間的依賴關係(或者反轉對象所在的地方)。

您的服務層接口仍應駐留在您的服務層組件或另一個組件中的其他地方 - 而不是在您的UI中。但是,UI層和Service層之間的依賴關係應該顛倒過來。

下面是一個正常的依賴性看起來像(箭頭向下和UI取決於具體的對象):

Non DI

這裏是依賴反轉的樣子(箭頭反轉和UI依賴於抽象,而不是):

Dependency Inversion

注意,這有沒有哪裏的東西應該是概念..但希望它可以簡化您的理解 這個概念。

+0

你確定服務如果我想更改服務層,它會破壞UI層。這裏有一個很好的關於界面在哪裏生活的圖表:http://en.wikipedia.org/wiki/Dependency_inversion_principle。在他的書「敏捷 - 原則 - 模式與實踐」中,Bob叔叔也展示了類似的圖表。他還提到了在多客戶端情況下獨立接口項目的方法。據我所知,如果你把接口放在服務層,那麼當UI層變得嚴重依賴服務時,它也會違反顧慮的分離。 – jubair 2015-04-04 12:06:36

+0

注意我也說'或者在其他地方的另一個程序集中。 – 2015-04-04 13:27:03