什么是依赖注入?

Jas*_*son 2 asp.net-mvc dependency-injection

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

我正在学习asp.net mvc 3.其中一个新功能是依赖注入.有人能告诉我它是什么吗?为什么有用?什么时候使用它?谢谢

Mic*_*ins 6

依赖注入是为消费代码提供依赖性而不是负责实例化对象本身的代码的过程.在一个原始示例中,您可能有一个类负责计算所呈现服务的发票.你实现它并调用它的'Calculate'方法:

public class InvoiceBiller
{
    public void Bill()
    {
        Calculator calculator = new Calculator();
        var totalAmountDue = calculator.CalculateBill(hoursWorked);
    }
}
Run Code Online (Sandbox Code Playgroud)

此方法取决于Calculator类.没关系,它有效.但是,依赖注入会让你"注入"Calculator依赖:

public class InvoiceBiller
{
    private readonly Calculator calculator;

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

    public void Bill()
    {
        var totalAmountDue = calculator.CalculateBill(hoursWorked);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

更进一步,您通常传入一个接口而不是具体类型:

public class InvoiceBiller
{
    private readonly ICalculator calculator;

    public InvoiceBiller(ICalculator calculator)
Run Code Online (Sandbox Code Playgroud)

现在你正在针对接口进行编程而不是实现.再次从您的测试中,您可以使用模拟框架来创建接口类型的模拟并将它们传递给类.