9

目前,我在IoC中使用Autofac,並且在兩個組合根(一個用於前端,另一個用於後端)中,我註冊並解析跨越Service,BusinessData層。N層架構中的Autofac模塊

截至目前我有一個像'AccountingModule'。現在我要添加幾個新的模塊到應用程序中,像InventoryModule,...

我的問題是我應該在每個模塊類之間分層(解決方案1)還是分別爲每個模塊模塊(溶液2)

解決方案1:

Service Layer 

(AccountingMoudle, InventoryModule, ...) 

Business Layer 

(AccountingMoudle, InventoryModule, ...) 

Data Layer 

(AccountingModule, InventoryModule, ...) 

解決方案2:

AccountingModule 
(
Service Layer, 
Business Layer, 
Data Layer 
) 

InventoryModule 
(
Service Layer, 
Business Layer, 
Data Layer 
) 

編輯1

+-----------------------------+        +----------------------------+ 
+--+AccountingServiceComponent        +-+InventoryServiceComponent 
|          Weak Dependency  | 
+--+AccountingBusinessComponent  <------------------+ +-+InventoryBusinessComponent 
|               | 
+--+AccountingDataComponent         +-+InventoryDataComponent 
     +               + 
     +-+ GetDocumentByID(int id)        +--+GetProductByID(int id) 
     |               | 
     +-+ SaveDocument(Document d)        +--+SaveProduct(Product p) 

編輯2 架構:

enter image description here

+5

每個終端應用程序應該只有一個組合根。在你的情況下,你似乎只有一個最終應用程序,所以你應該有一個組合根。 – Steven

+0

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

回答

4

目前我使用Autofac爲IOC和在兩個組合物根(一個 爲前端,一個用於後端)

我知道這只是一個具有前端和後端部分的應用程序。 首先你應該有一個組合根,否則你的設計會在某個時候失敗。你擁有哪種解決方案並不重要。

假設他們是兩個不同的驅動程序應用程序(如Web服務和網站)。

我的問題是,我應該在各層之間拆分每個模塊類 (方案一)或有單獨的所有圖層爲每個模塊(解決方案 2)

編輯:其實你的問題是「水平(解決方案1)還是垂直(解決方案2)切片更好?」 (Partition Your Application into Modules

Horizontal vs Vertical slicing文章解釋得很好。它說

當你可以垂直。當你也有水平時。

這裏是另一個不錯article

你的編輯後,我看你已經實現了你的模塊爲垂直這​​樣下去垂直(溶液2)。

+0

假設A&B是我們的模塊,請你說說與解決方案1有什麼不同?在我的解決方案1中,給定模塊的不同部分放置在相應的層中,並以標準的服務,業務,數據順序訪問。 –

+0

我添加了一個類的圖表。我對你答案中模塊的含義有疑問。這裏我通過模塊來表示一組相關的類,它們之間有很強的依賴關係,並且與應用程序的其他部分依賴性較弱。在我的圖中只有兩個,實際上可能有10個或更多的模塊。 –

+0

我用提出的圖表結束了。現在就Autofac而言,我應該將子域的所有子層(InventoryUIComponent,InventoryServiceComponent,InventoryBusinessComponent,InventoryDataComponent)註冊爲單個InventoryModule嗎?將來可能會有更多這樣的子域名,其中大部分可能是最終用戶的可選域名。 –

1

您不應該嘗試將Autofac模塊移動到庫中,您可能正在嘗試做同樣的事情,這就是爲什麼您首先要問這個問題。

If you have multiple composition roots, then you should create the modules in each one. There is a good chance that different composition roots might use different modules. Further you probably don't want to add Autofac as a reference to every library in your solution.

我的問題是,我應該在層之間分開每一個模塊的類 (溶液1),或具有單獨的所有層爲每個模塊(溶液 2)

取決於註冊的號碼,如果是一個非常小的數字,那麼你可以使用AccountingModuleInventoryModule

如果會計中有很多註冊但庫存數量很少,那麼您可以有AccountingServiceModule, AccountingBusinessModule, AccountingDataModuleInventoryModule。您可以從應用程序的每個子域(庫存,帳戶等)的一個模塊開始,並根據需要對其進行分割。