2011-01-14 197 views
2

可能重複:
What is dependency injection?什麼是依賴注入?

林學習asp.net的MVC 3.一個新的功能是依賴注入。有人能告訴我它是什麼嗎?爲什麼它有用?以及何時使用它?由於

+3

重複的【什麼是依賴注入?](http://stackoverflow.com/questions/ 130794 /什麼,是依賴注入) – jfar 2011-01-14 05:36:49

回答

6

依賴注入是爲消費代碼提供依賴關係的過程,而不是負責實例化對象本身的代碼。在一個簡單的例子中,您可能有一個負責計算所提供服務的發票的類。你可以立即使用它並將其稱爲「計算」方法:

public class InvoiceBiller 
{ 
    public void Bill() 
    { 
     Calculator calculator = new Calculator(); 
     var totalAmountDue = calculator.CalculateBill(hoursWorked); 
    } 
} 

此方法依賴於Calculator類。這很好,它的工作原理。然而depenedency注入將有你「注入」計算器的依賴:

public class InvoiceBiller 
{ 
    private readonly Calculator calculator; 

    public InvoiceBiller(Calculator calculator) 
    { 
     this.calculator = calculator; 
    } 

    public void Bill() 
    { 
     var totalAmountDue = calculator.CalculateBill(hoursWorked); 
    } 
} 

正如你可以在InvoiceBiller類是通過它的構造(依賴注入的形式被稱爲構造函數注入)給出的計算器對象第二個例子中看到。 InvoiceBiller不再關心如何獲取賬單實例,而是簡單地給它一個。

這有助於測試。你可以從你的測試中通過你想要的任何計算器實例。在實際產品運行時,您可以通過計算器連接到數據庫並查看每小時的費率。爲了測試您傳遞一個使用硬編碼率的計算器,以便您的測試不需要訪問數據庫。

採取此基礎上更進一步,你一般通過一個接口,而不是一個具體類型:

public class InvoiceBiller 
{ 
    private readonly ICalculator calculator; 

    public InvoiceBiller(ICalculator calculator) 

現在你對編程接口而不是實現。再次從測試中,您可以使用模擬框架來創建您的界面類型的模擬並將其傳遞給類。

3

事實上,這裏有兩個問題。有「什麼是依賴注入?」和「什麼是MVC 3中新增的」增加了更多'依賴注入支持?「。

依賴注入是一種編程模式,當類沒有定義其他類的新對象之前,他們使用它們(如某些電子郵件發件人類,需要在數據庫中記錄電子郵件不會創建新的記錄器實例),但請求它在不知道它可能是哪個類的情況下提供(使用接口,在我們的例子中稱爲ILogger)。這裏的記錄器是一個依賴項,這個依賴項通過許多方式被請求/注入,或者被請求作爲依賴類的構造函數參數(例如EmailSender),或者只是將它作爲類「set」訪問器的屬性,等等...

有一些庫稱爲依賴注入庫,或控制容器的反轉。那些庫是用來定義哪些類應該在運行時真正使用的,以及要使用哪些其他特定值,並告訴它們爲您創建對象(如創建EmailSender實例),遞歸地將所有依賴項傳遞給它們(所以,如果ILogger實際上是一個需要連接字符串的DBLogger,它也會發送它,等等。)。例子是溫莎,Ninject,Autofac,微軟團結,...

對於示例代碼和更明顯的例子,看到一個傢伙這個漂亮的免費視頻誰在使用ASP.NET MVC團隊合作:
http://tekpub.com/view/concepts/1

ASP.NET MVC總是允許一個工廠類,您可以重寫如何創建Controller類(以便您可以使用DI容器庫創建控制器及其依賴關係,就像它是或EmailSender類一樣)。什麼排在ASP.NET MVC 3.0是在現有功能的改進,並提供更多的方法,如它,使它更容易做DI各地ASP.NET MVC

檢查出來的深細節...