依赖注入

依赖注入背后的基本思想是创建更松散耦合的代码。当一个类而不是新建它自己的依赖项而不是接受它的依赖项时,该类变得更加简单,可以作为一个单元进行测试( 单元测试 )。

为了进一步阐述松散耦合 - 这个想法是类依赖于抽象,而不是结构。如果类 A 依赖于另一个具体类 B,那么没有 B 就没有真正的 A 测试。虽然这种测试可以正常,但它不适合单元可测试的代码。松散耦合的设计将定义 A 所依赖的抽象 IB(作为示例)。然后可以模拟 IB 来提供可测试的行为,而不是依靠 B 的真实实现来为 A 提供可测试的场景。

紧耦合的例子(C#):

public class A
{
    public void DoStuff()
    {
        B b = new B();
        b.Foo();
    }
}

在上面,类 A 取决于 B。没有混凝土 B 没有测试 A。虽然这在集成测试场景中很好,但很难对单元进行单元测试 15。

上面的松散耦合实现可能看起来像:

public interface IB
{
    void Foo();
}

public class A
{
    private readonly IB _iB;

    public A(IB iB)
    {
        _iB = iB;
    }

    public void DoStuff()
    {
        _b.Foo();
    }
}

这两个实现看起来非常相似,但是有一个重要的区别。A 类不再直接依赖于 B 类,它现在依赖于 IBA 类不再有责任新建自己的依赖 - 现在必须提供 A