回答

2

IOC系統中的「容器」是包含如何解決依賴關係的映射的組件。例如,它會知道當IFoo的接口的依賴關係被請求時,它將解析爲FooImpl。

您通常必須在某處執行這些映射。通過配置文件,註釋或其他運行時組件。

您通常會從此類容器中獲取所有分辨率。它有時也被稱爲內核。

+0

容器是我描述的一個桶,其中接口的所有實現都處於活動狀態,IOC在需要解析依賴關係時將其浸入桶中 – Burt 2011-12-17 18:26:42

+0

何時可以更容易地解決您自己代碼之外的依賴關係?你怎麼知道你什麼時候需要容器? – 2011-12-17 18:35:23

+1

我遵循「痛苦中的屁股」規則。一旦擁有一個容器,屁股上的疼痛就會少於沒有一個。我添加一個。 – ryber 2011-12-17 23:21:23

0

我認爲你需要保持術語清晰:

的IoC是控制,這是該系統的主要流程是由應用程序核心之外的東西處理原則的反轉。這就是有一個排序的容器來協調執行,並且有封裝業務邏輯的應用程序代碼。 wikipedia article on IoC給出了一個很好的解釋。

DI是依賴注入,這是一個代碼單元沒有新增其依賴性的想法,但從代碼中獲得它們來安裝單元。再次wikipedia a has good article on DI

將這兩者結合意味着擁有一些集中化的東西,它負責將所有東西安置並解決依賴關係。無論什麼centrized代碼,這是IoC/DI容器。你可以自己寫或使用現成的。

+0

維基百科有關IoC的文章指出:「依賴注入是實現控制反轉的主要方法」。看起來容器不在IoC的範圍之內? – 2011-12-19 22:46:51

1

依賴注入通過將依賴關係的連線移動到應用程序中的單個位置(啓動路徑也稱爲Composition Root),有助於使代碼具有可維護性。這非常棒,因爲Composition Root(就像您應用程序中的其他所有內容一樣)承擔一項責任。

當您的應用程序發展壯大時,您會發現這些類本身不會變得更復雜(當遵守SOLID原則時)。然而,組合根很快就會變得龐大而複雜,特別是在使用裝飾器添加行爲並按照慣例進行註冊等操作時。

這是DI容器進場的地方。儘管SOLID原則可幫助您設計靈活且可維護的應用程序,但DI容器將幫助您保持Composition Root的可維護性。這是它唯一的目的。你用容器做的每一件事都可以在沒有它的情況下完成,但是這往往會導致很多重複性和樣板代碼難以閱讀和難以維護。

因此,DI容器的唯一目的就是讓組合根可維護。

+0

無論您保存在代碼還是xml文件中,組合根目錄是否會變得龐大而複雜? – 2011-12-18 20:08:52

+0

我儘可能避免使用XML配置,因爲它很醜,並且沒有編譯時支持。良好的應用程序設計有助於簡化組合根(CR)。例如,當圍繞[命令模式](http://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)和[查詢模式](http:// www .cuttingedge.it/blogs/steven/pivot/entry.php?id = 92),你會發現幾乎所有東西都可以被容器自動註冊。當您的CR變得複雜時,看看您的設計,開始使用DI容器或切換容器。 – Steven 2011-12-19 12:36:07

0

容器的責任是管理實例。