2009-06-15 33 views
2

DI/IOC:有很多框架,並且這些示例很快就會被粘貼到特定於該框架的細節中。我發現,如果我能夠在框架之外學習其原理(樹木遮蔽樹木),我通常會學到最好的新技術。是否存在分層方法來控制依賴注入/控制反轉

我的問題:DI/IOC的簡單原則是什麼?我正在尋找一種(框架不可知的)構建方法,其中概述了每種簡單原理所獲得的成果,選擇的成本以及成本。請不要粘貼鏈接,除非他們真正解決我的問題。我一直在那些森林迷路;}

第二個問題:一旦我理解了核心原則,是否值得建立我自己的簡單框架? IE,相對於所付出的努力,獲得的洞察力會有價值嗎?

在此先感謝! 羅伯特

回答

4

我非常快速和骯髒對其採取

  • 依賴注入控制反轉並同樣的事情。控制反轉使用 DI。

  • IoC是一種在運行時將應用程序拼接在一起而不是編譯時間的方式。

  • 而不是在代碼中'新建'一個類型,它在運行時由IoC容器注入。

  • IoC容器知道要注入什麼類,因爲a)它查看該類的構造函數 - 所有參數都是接口。 b)它會查看它的配置文件,並查看實現了每個接口的哪些類用於在應用程序中表示該接口。

這裏是一個非常簡單的例子

比方說,你有一個接口IEmailer用於發送電子郵件:

public interface IEmailer 
{ 
    void SendEmail(); 
} 

而且至少有一個實現這個接口:

public class IainsEmailer : IEmailer 
{ 
    public void SendEmail() 
    { 
     // Send email 
    } 
} 

您在IoC容器的con中定義圖文件(在某種程度上):

IainsEmailer is my choice for IEmailer 

然後在你的代碼,你可以有以下和IoC容器將注入的IainsEmailer到需要的任何IEmailer構造。

public class MyClass 
{ 
    private IEmailer _emailer; 

    public MyClass(IEmailer emailer) 
    { 
     _emailer = emailer 
    } 

    // You can now use emailer as if you have created it 
    _emailer.SendEmail(); 
} 

我可以繼續。並且。但這實際上就是IoC的全部概念。

2

這是一個有點過時,但很好地概括Inversion of Control

對我來說,推動國際奧委會基本原則是組件,模塊化,鬆耦合,凝聚力的概念。這意味着您可以設計分解爲具有清晰依賴關係的連貫模塊化單元的軟件,或與其他單元的鏈接。這是任何領域工程的基本原則,而不僅僅是編程。一旦你具有模塊性,爲了創建一個功能系統,你需要一種方法來鏈接這些組件,以便它們形成一個功能整體。 IoC/DI框架是抽象這種鏈接概念的組件,並允許您編寫聲明組件之間鏈接的代碼,然後有能力執行這些鏈接。 「反轉」部分來自這樣一個事實,即組件本身不再鏈接到它們的依賴關係,而是由鏈接組件在外部執行鏈接。這又被稱爲依賴注入。典型的IoC/DI框架允許您編寫指定另一個組件所依賴的接口的特定實現的代碼,然後允許您實例化該組件,並在創建時由IoC容器提供所需的實現。然後這抽象了對象創建的概念。

1

您的問題需要一份完整的維基百科文章。我假設你已經閱讀過關於實際文章的內容,所以這裏是我對你的問題的簡短回答:依賴注入就是關於實例化。

主要思想是類不應該負責實例化它們的依賴關係。 DI框架接管實例化,因爲它可以通過(通常)代碼外部的配置機制靈活地實現。

這使您可以編寫出類:

  1. 從它們的依賴關係脫鉤。
  2. 更好地關注他們的實際責任(而不是依賴關係)
  3. 可以通過配置進行更改,無需重新編譯。
  4. 更容易測試。
  5. 可以說,設計得更好。

要回答你的第二個問題:如果你想學習 DI,然後寫一個框架,自己顯然是矯枉過正。我會建議你選擇一個流行的開源框架並編寫代碼來消耗它 - 大多數都有很好的教程來達到這個目的。

把它提升到一個新的水平,你可以獲得你正在使用的框架的源代碼並開始挖掘它。良好的框架寫得很好,相對容易閱讀。

祝你好運! urig

PS - 如果您使用.net,請不要以MEF開頭。從Windsor,Unity或Spring.Net開始。 MEF不僅僅是一個DI框架,所以稍後再做。

相關問題