2011-02-18 66 views
2

我在研究類之間的高耦合,特別是IoC。 我想問一些問題:關於IoC的問題

  1. 我正在使用Ninject;哪一層我應該把dll Ninject
  2. 當我創建一個設置發送到客戶端時,dll Ninject也會去找客戶嗎?
  3. 我一直在研究互聯網,得出如下結論: a。控制反轉是當我改變我的類,並且我沒有在他們自己的類中實例化它們,而是作爲參數或使用Ninject b。依賴注入是當我添加到我的項目接口而不是具體的類。

回答

1

Ad2。您必須將ninject dll添加到您的設置中。

Ad3。控制反轉(IoC)與接口和類無關。您可以使用高度耦合的代碼來控制反轉。

class GodClass 
{ 
    void DoSth(int param) 
    { 
     switch (param) 
     { 
      case 0: Console.WriteLine("param is 0"); break; 
      case 1: Console.WriteLine("param is 1"); break; 
     } 
    } 
} 

,並與國際奧委會它可能看起來像:

class GoodClass 
{ 
    Dictionary<int, BaseClass> _consoleWriters; 

    public GoodClass(IEnumerable<BaseClass> writers) 
    { 
     foreach (var writer in writers) 
      _consoleWriters.Add(writer.ParamSupported, writer); 
    } 
    void DoSth(int param) 
    { 
     _consoleWriters[ param ].DoSth(); 
    } 
} 

abstract class BaseClass 
{ 
    abstract int ParamSupported {get;} 
    abstract void DoSth(int param); 
} 

class ZeroWriter : BaseClass 
{ 
    override int ParamSupported {get{return 0;}} 
    override DoSth(int param) { Console.WriteLine("param is 0"); } 
} 

class OneWriter : BaseClass 
{ 
    override int ParamSupported {get{return 1;}} 
    override DoSth(int param) { Console.WriteLine("param is 1"); } 
} 

廣告1。我將在Main函數中添加IoC框架配置/初始化,並將引用初始化容器傳遞給其餘代碼。

+0

謝謝! 我會繼續學習。 – ridermansb 2011-02-18 18:27:46

2
  1. IoC的概念與建築圖層的概念是正交的。每當您使用Ninject功能(例如[Inject]屬性(通常在注入類的級別)或(b)無論您設置內核和模塊(通常在客戶端級別))時,您都必須參考Ninject(a)。

  2. 是的。 Ninject將成爲運行時的依賴。

  3. 國際奧委會可能會出現這些行爲,但其核心概念可能會被更好地理解爲Holywood principle:不要打電話給我們,我們會打電話給你。這意味着,不要打擾建立你的依賴關係,因爲它們將爲你提供。儘管Ninject等工具可以極大地緩解您的生活,但您可以通過多種方式達到此目的,即使是「手動」。無論如何,通過參數接收依賴對象(主要是在對象構造期間)是一種非常常見的模式,因爲它通過接口而不是類來定義依賴關係。

使用接口可以幫助你從實現建立合同,以更好地分開的要求(這是擺在首位應用的IoC驅動的原因)。另外,它可以幫助你編寫測試和模擬。但那是另一個可能性的世界。玩的開心!我已經使用Ninject將近一年了,而且我發現它非常易於使用和維護。

0
  1. 你應該有Ninject參考anyhwere您使用它來註冊&解決您的依賴。最明顯的地方在於你的應用程序外殼/入口點。
  2. 關於依賴注入......根據您所說的語言,這可能不是真的。在C#/ VB.NET的情況下,是的。在JavaScript,Ruby等動態語言中並非如此。我想現在,如果你使用的是DynamicObject,它也可能是錯誤的。通過指定你的類依賴於一個接口而不是一個具體的類,你可以手動地或通過使用像Ninject這樣的IoC容器輕鬆地注入該接口的不同實現。

    On Inversion of Control ...它基本上是說不是調用類/方法創建其他組件需要執行其工作,而是讓它在別處創建並傳遞給您的類/方法。打破這個具體的依賴關係鏈將使你的代碼更加鬆散耦合,並允許你用一個實現了相同接口/契約的不同組件來替換所需組件的一個實現。

    上依賴倒置原則/ IOC一個很好的解釋,可http://www.objectmentor.com/resources/articles/dip.pdf找到。

    這個主題

    其他好的資源: