2016-10-18 125 views
0

考慮我有一個應用程序使用三個庫,lib1,lib2和lib3。在每個庫中,我都實現了一個Module,它註冊了該庫中實現的依賴關係。Autofac模塊應該註冊自己的從屬模塊嗎?

其中一些實現有它們自己的依賴關係,例如,lib2和lib3可能都需要lib1中存在的某些實現。

我的問題是,我是否讓lib2和lib3中的模塊在lib1中將模塊註冊爲Load實現的一部分?如果我的應用程序註冊了lib2和lib3的模塊,是否會註冊該模塊兩次?

還是我不會讓模塊註冊另一個模塊,讓它上升到應用程序,缺點是啓動時可能缺少一些註冊?

+0

這個問題不是關於庫是否註冊自己的註冊是否可行。他們不。他們只是提供一個外觀來幫助註冊這些依賴項,以供組合根使用。 –

回答

0

一個Autofac Module只不過是一個外觀,以幫助註冊組件。它不應該調用其他模塊來註冊已知是自己註冊依賴項的實現,因爲這會將兩個模塊綁定在一起,從而增加耦合性。

此外,如果同一個模塊被多次註冊,註冊本身將被多次應用,因爲Autofac不會跟蹤已經註冊的模塊。這通常不會造成問題,除非組合根無意中取消了任何旨在覆蓋現有註冊的註冊。

1

通常,應該只有一個包含配置的庫。這個庫是啓動項目,這個地方在所有連接的應用程序中通常被稱爲Composition Root。通常,只有啓動項目才具有組合根,並且只有當單個解決方案中的多個啓動項目共享大量重複註冊時,纔會開始將此代碼提取到可供這些組合根重用的通用位置。但要小心:一般Composition Roots should not be reused

+0

當然,但我沒有重用組合的根源。我正在重複使用創建的外牆,以便更容易地在庫中註冊內容。 –

1

我不會推薦在您的圖書館內進行註冊。在大多數情況下,您應該有一個組成所有應用程序的組合根。

組合根是一個(最好)在模塊組合在一起的應用程序中的唯一位置。

這個概念在這裏解釋composition root

順便說一句,如果您多次註冊一個模塊,Autofac將註冊組件multipe時間。如果您的庫中必須有模塊,則只應創建庫的註冊組件模塊。

+0

嗯,我有多個組合根,一個用於解決方案中的每個應用程序。當然,我不需要重寫所有的註冊碼?如果是這樣,擁有模塊有什麼意義? –

+0

模塊可以幫助您組織註冊。它還允許您附加已經註冊的組件或註冊源以修改註冊行爲。有關* Autofac *模塊的更多信息,請參見http://docs.autofac.org/en/latest/configuration/modules.html –