16

Microsoft的Unity依賴注入框架可以通過代碼或通過應用程序配置文件(app.config)進行配置。Unity應該在代碼或配置文件中進行配置嗎?

代碼示例:

IUnityContainer container = new UnityContainer() 
    .RegisterType<IInterface, ConcreteImplementation>(); 

配置例子:

<unity> 
    <containers> 
     <container> 
      <types> 
       <type type="IInterface, MyAssembly" 
         mapTo="ConcreteImplementation, MyAssembly" /> 

有什麼優勢/劣勢每種方法?我可以想到「用戶可以輕鬆配置您的應用程序」的明顯優勢,以及「用戶可以輕鬆打破您的應用程序」的明顯缺點,但是有什麼不明顯的嗎?

+0

Duplicate:http://stackoverflow.com/questions/2512316/ioc-dependency-injection-please-explain-code-versus-xml – 2011-03-24 11:45:03

+0

不是重複的。這個問題涉及如何使用基於代碼的配置。我的問題是爲什麼 - 權衡/好處是什麼。 – 2011-03-24 12:32:19

+0

好吧,夠公平的 - 我會嘗試回答。 – 2011-03-24 12:52:58

回答

31

XML配置真的只對單一事物有好處:延遲綁定。使用XML配置,您可以更改應用程序的組成方式,而無需重新編譯整個應用程序。這對於支持一定程度的用戶配置的ISV應用程序特別相關。 ISV可以通過默認行爲發佈已編譯的應用程序,但可以通過更改配置使客戶/用戶更改部分行爲。

但是,XML配置很脆而且詳細。從開發人員的角度來看,使用這只是一個痛苦。

  • 當您重命名類型或程序集時,配置往往會中斷。
  • 您必須手動將相應的.dlls複製到輸出目錄(或者讓構建腳本執行此操作)。
  • 總體冗長性使其很難處理。
  • 工具支持比強類型代碼弱。

作爲一個經驗法則,寧願代碼作爲配置。但是,您可以將代碼作爲配置與XML配置匹配,因此如果您有一些應該延遲綁定的依賴項,則可以使用XML配置。

+0

這很好。我本能地喜歡的代碼,這是爲什麼清楚的解釋。我們有幾個Web服務可能需要延遲綁定,所以我們只需要一些XML條目。 – 2011-03-24 13:33:43

+0

ISV代表「獨立軟件供應商」。也可以編寫一個簡單的表單來生成/編輯這樣的後期綁定配置,至少避免用戶輸入錯誤。 – GregC 2011-04-07 00:24:47

2

問題已經回答了,但我想總結我的經驗:

使用二者。 當我有幾個標準配置(通常 - 因爲我使用IoC),我將代碼配置隱藏到擴展中,然後我有幾個擴展,它們共享主配置。

我使用XML配置執行非標準任務,如性能調整(在重新編譯需要很長時間的環境中)。

9

通過代碼配置的一個顯着缺點是代碼需要引用程序集。這意味着我必須在項目中添加項目或DLL引用才能編譯代碼。

依賴注入應該刪除組件之間的依賴關係。通過代碼初始化通過需要項目或DLL引用來重新引入依賴項。 xml配置文件可以引用任何程序集。

如果我基於接口創建一個新的實現,我可以通過添加編譯後的DLL並更新xml配置文件來將新實現集成到現有應用程序中。如果我通過代碼進行配置,我必須重新編譯應用程序才能替換實現。

+3

刪除依賴關係不僅僅是刪除'dll依賴關係'。它是關於分離關注和SRP。能夠在沒有編譯的情況下更換組件是很好的,但遠不是那些重要的IMO在更大規模的計劃中 – 2011-11-14 22:13:21

相關問題