2011-01-14 145 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

检查出来的深细节...