什么是依赖注入?

可能重复:
什么是依赖注入?

Im学习asp.net mvc 3.依赖注入的新功能之一。 有人能告诉我它是什么吗? 为什么它有用? 以及何时使用它? 谢谢


依赖注入是向消费代码提供依赖关系的过程,而不是负责实例化对象本身的代码。 在一个简单的例子中,您可能有一个负责计算所提供服务的发票的类。 您立即启动并调用其“计算”方法:

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

此方法依赖于Calculator类。 这很好,它的工作原理。 然而,依赖注入会让你“注入”计算器依赖:

public class InvoiceBiller
{
    private readonly Calculator calculator;

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

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

正如您在第二个示例中看到的,InvoiceBiller类通过其构造函数(一种称为构造函数注入的依赖注入形式)被赋予了一个Calculator对象。 InvoiceBiller不再关心如何获取账单实例,而是简单地给它一个。

这有助于测试。 你可以从你的测试中通过你想要的任何计算器实例。 在实际产品运行时,您可以通过计算器连接到数据库并查看每小时的费率。 为了测试您传递一个使用硬编码率的计算器,以便您的测试不需要访问数据库。

更进一步,您通常会传入一个界面而不是具体的类型:

public class InvoiceBiller
{
    private readonly ICalculator calculator;

    public InvoiceBiller(ICalculator calculator)

现在你正在编程接口而不是实现。 再次从测试中,您可以使用模拟框架来创建您的界面类型的模拟并将其传递给类。


事实上,这里有两个问题。 有“什么是依赖注入?” 和“什么是MVC 3中新增的”增加了更多'依赖注入支持?“。

依赖注入是一种编程模式,当类没有在使用它们之前定义其他类的新对象时(例如需要在数据库中记录电子邮件的某些电子邮件发件人类不会创建新的记录器实例),但是请求它没有提供知道它可能是哪个类(使用一个接口,在我们的例子中说ILogger)。 这里的记录器是一个依赖项,这个依赖项通过许多方式被请求/注入,或者被请求作为依赖类的构造函数参数(例如EmailSender),或者只是将它作为类“set”访问器的属性,等等...

有一些库称为依赖注入库,或控制容器的反转。 那些库是用来定义哪些类应该在运行时真正使用的,以及要使用哪些其他特定值,并告诉它们为您创建对象(如创建EmailSender实例),递归地将所有依赖项传递给它们(所以,如果ILogger实际上是一个需要连接字符串的DBLogger,它也会发送它,等等。)。 例子有Windsor,Ninject,Autofac,Microsoft Unity ......

有关示例代码和更清晰的示例,请参阅以前在ASP.NET MVC团队中工作的人员的这段精彩免费视频:
http://tekpub.com/view/concepts/1

ASP.NET MVC总是允许一个工厂类,在这里你可以重写如何创建Controller类(这样你就可以使用DI容器库来创建控制器及其依赖关系,就好像它是EmailSender类一样)。 ASP.NET MVC 3.0中的内容是对现有功能的改进,并提供了更多类似的方法,以便更容易地在ASP.NET MVC上执行DI

  • 官方的ASP.NET MVC 3.0发行说明:附加的依赖注入支持
  • http://blogs.microsoft.co.il/blogs/gilf/archive/2010/10/17/dependency-injection-in-mvc-3-was-made-easier.aspx
  • http://johan.driessen.se/archive/2010/10/30/dependency-injection-in-asp.net-mvc-3-got-a-lot-simpler.aspx
  • ASP.NET MVC 3服务位置:简介(第1部分)
  • ASP.NET MVC 3服务位置:控制器(第2部分)
  • ASP.NET MVC 3服务位置:视图(第3部分)
  • ASP.NET MVC 3服务位置:过滤器(第4部分)
  • 检查他们的深刻细节...


    可能更适合程序员,但首先要了解控制反转

    http://en.wikipedia.org/wiki/Inversion_of_control

    http://www.martinfowler.com/articles/injection.html

    这个想法是组件不应该知道如何获得/创建它的依赖关系,应该提供它完成工作所需的东西。

    链接地址: http://www.djcxy.com/p/14401.html

    上一篇: what is Dependency Injection?

    下一篇: What are Dependency Injection & Spring Framework about?