本問題已經有最佳答案,請猛點這里訪問。
Possible Duplicate:
What is Inversion of Control?
我知道依賴注入(DI)是什么(我想!).基本上是滿足對象可能具有的依賴關系。我試著想想當使用DI作為面向服務的時候我寫的代碼,我把我的代碼定義為使用其他服務。
然而,我現在想知道,在使用IOC時,我們到底是在改變對什么的控制。這是一個相當模糊的術語,可能意味著一些事情。
但是,我認為創建由IOC框架處理的對象(并因此滿足使用DI的依賴性)是有責任的。
應用程序仍然有責任要求它使用的對象(即服務),區別在于它不知道(或不關心)如何創建它。那么,為什么服務定位器被認為是反模式的,如果它所做的一切都是請求服務?
我說得對嗎?或者是其他什么意思。另外,我是否正確地將DI和IOC的職責分開了?如果我有一個IOC框架,就不能在沒有DI框架的情況下運行。或者DI只是IOC框架的一個特性?
看:什么是控制反轉?另請參見:為什么我需要一個IOC容器而不是直接的DI代碼?
我認為你提供的第一個鏈接回答問題的方式不對
依賴注入通常意味著將依賴對象作為參數傳遞給方法,而不是讓方法創建依賴對象。它在實踐中的含義是,方法不直接依賴于特定的實現;任何滿足需求的實現都可以作為參數傳遞。
控制反轉只認識到依賴關系是反轉的。A不是通過創建、實現或直接調用B來依賴B,而是接收B作為參數,并且不再以任何方式對B負責。
將參數類型實現為接口簡化了過程,并將其概括,但這并不是嚴格必要的。
控制反轉是一種普遍的模式。依賴注入就是這種模式的一種用法。有關更多信息,本文由MartinFowler撰寫,特別是標題為"控制反轉"的部分。
現在很多人都避免使用DI的"控制反轉"一詞,因為反轉與人們在依賴注入變得普遍之前所做的事情相比較。如果你現在已經習慣了依賴注入,或者是從一開始就有足夠幸運地這么想的人之一,那么試圖弄清楚被反轉的是什么只是令人困惑。
啊哈-事實上現在更有意義了。這是一個相對的術語,一旦你改變了使用依賴注入的心態,那么"反轉"就不再意味著什么了。在我開始使用Castle Windsor之前,我已經使用依賴注入很長一段時間了。當時,它只是為了使編寫單元測試更容易。
控制反轉基本上意味著應用程序代碼不關心它需要的部分來自何處。
您可以通過各種類型的依賴注入來實現IOC。
與Java世界中的情況相反,包裝器可能通過JNDI按名稱請求資源。在這種情況下,代碼要求它的需求,而不是提供它。
您說"應用程序仍然有責任要求它使用的對象(即服務),區別在于它不知道(或不關心)如何創建它。"
我不認為這是真的;組件不要求其他組件。依賴關系是從更高的層次注入的,這是一種不同的語義。這就是國際奧委會。