2010-06-22 64 views

回答

4

DI容器的核心是基於接口和具體類型之間的映射創建對象。

這將允許用戶從容器請求一個抽象類型:

IFoo f = container.Resolve<IFoo>(); 

這需要你有先前配置容器以從IFoo的映射到實現的IFoo(例如富的具體類)。

這本身就不是特別令人印象深刻,但DI容器做多:

  • 他們使用自動裝配這意味着它們可以自動計算出,如果IFoo的映射到Foo和伊巴爾映射到Bar,但是Foo依賴於IBar,當你請求IFoo時,它會創建一個帶有Bar的Foo實例。
  • 他們管理組件的使用壽命。你很多時候都想要一個新的Foo實例,但在其他情況下,你可能需要同一個實例。您甚至可能每次都需要新的Foo實例,但注入的Bar應該保持相同的實例。

一旦你開始嘗試手動管理組成壽命你應該開始欣賞由DI容器:)提供的服務

很多DI容器可以做得比上面的要多得多,但這些是核心服務。大多數容器提供configuring via either code or XML的選項。

當涉及到適當的使用的容器,Krzysztof Kozmic剛剛公佈a good overview

2

您可以配置一個DI容器,以便了解您的接口和類型 - 每個接口如何映射到某個類型。

當您調用Resolve時,它會查看映射並返回您請求的映射對象。

一些DI容器使用約定而不是配置,例如,如果您定義了一個接口ISomething,它將查找具體的Something類型來實例化並返回。

+0

短而甜,無毒類汽車類比! – Shog9 2010-06-22 19:38:19

4

沒什麼比對象的花式哈希表 更多。

雖然上面是一個巨大的輕描淡寫那是想着他們的簡單方法。鑑於收集,如果你要求一個類的同一個實例--DI容器將決定是否給你一個緩存版本或新的,或以此類推。

他們的使用使得它更容易和更乾淨,當涉及到配合依賴。想象一下你有以下僞類。

class House(Kitchen, Bedroom) 
    // Use kitchen and bedroom. 
end 

class Kitchen() 
    // Code... 
end 

class Bedroom() 
    // Code... 
end 

構建的房子是沒有DI容器中的疼痛,你需要創建一個臥室的一個例子,接下來是廚房的一個實例。如果這些對象也有依賴關係,則需要將它們連接起來。反過來,你可以花費很多代碼來連接對象。只有這樣你才能創造一個有效的房子。使用DI/IOC(Inversion of Control)容器,你說你想要一個房子對象,DI容器將遞歸地創建它的每個依賴關係並返回給你一間房子。

沒有DI/IOC容器:

​​

使用DI/IOC容器:

house = // some method of getting the house 

在這一天結束時,他們使代碼容易執行,更容易編寫和責任推卸將物體連接在一起,遠離手頭的問題。

+0

應該指出,DI是好的,因爲它阻止你不必編寫自己的複雜構造函數和自己的代碼來配置事物和一堆其他類似的東西。雖然是的,你不需要*它,它是很好的能夠利用現有的庫來處理所有這些東西給你。它使得配置Java應用程序(C#不是我的專業領域)看起來有點像使用一種可憐的,不一致的,過於複雜的腳本語言...... – 2010-06-22 19:47:38