2011-03-25 52 views

回答

8

術語沒有單一的定義 - 在一個容器中實現爲「子容器」的東西在另一個容器中通常具有完全不同的邏輯功能。

在Autofac和一些相似的容器中,「子容器」(因爲v2,只是一個「生命週期範圍」)是一種創建相關組件的方法,其生命週期比「父」容器短,因此依賴性只能從孩子到父母解決,而不能以其他方式解決。

其他容器有不同的實現方式,有些允許依賴解決方案兩種方式(至少在我的理解。)你正在使用的特定容器是一個重要的額外的信息,讓這個問題更權威地回答。

希望這會有所幫助!

+0

我沒有確切的上下文對不起,這只是一個普遍的問題,謝謝。 – 2011-03-29 04:02:07

+0

不客氣,很高興幫助。 – 2011-03-29 10:43:43

3

IoC - 或控制反轉 - 是一種讓您的課程依賴於服務和其他課程的方式,而無需真正知道如何啓動它們,只知道如何使用它們。請看下面的例子:

public class MyService 
{ 
    public void DoSomething() 
    { 
     Logger l = new Logger(); // let's assume this class exists, and it logs stuff 
     l.Info("Some info logmessage"); 
    } 
} 

在這裏,我們會打電話給該服務:現在

public class MyProgram { 
    public MyProgram() 
    { 
     MyService myService = new MyService(); 
     myService.DoSomething(); 
    } 
} 

,依賴注入或IoC的,我們可以顛倒記錄的責任。簡而言之,這意味着MyService不應該知道如何實現記錄器的實例化,但它應該知道如何使用它。

所以我們說的Logger類實現所謂ILog只包含無效的方法的接口Info(string s)

然後我們可以重構我們的MyService類這樣的:

public class MyService 
{ 
    ILog _logger; 
    public MyService(ILog logger) 
    { 
      _logger = logger; 
    } 
    public void DoSomething() 
    { 

     _logger.Info("Some info logmessage"); 
    } 
} 

這則意味着我們將不得不重構MyProgram以及:

public class MyProgram { 
    public MyProgram() 
    { 
     ILog logger = new Logger(); // instanciate it here instead. 
     MyService myService = new MyService(logger); 
     myService.DoSomething(); 
    } 
} 

這基本上是控制反轉,但是當我們開始談論依賴注入時,這可以全部自動化。比方說,我們想要使用Ninject進行注射。我不打算在這裏寫一個代碼示例,但基礎是Ninject將基本設置爲知道當某個類需要ILog接口時,我們應該返回Logger類。

這使我們能夠輕鬆地更改我們想要用於不同接口的實現方式 - 也提高了可測試性。

我會在tekpub上推薦這個簡短的免費視頻,通過使用Ninject介紹IoC和依賴注入的示例。

http://www.tekpub.com/view/concepts/1

希望這有助於!

+2

我看到我可能會誤解這個問題,更多地回答關於IoC和dep.injection的問題。對不起,我..我會留在這裏無論如何..也許它可以幫助某人:) – 2011-03-25 08:34:51

+0

謝謝你的反應! – 2011-03-29 04:02:34

相關問題