依赖注入
依赖注入背后的基本思想是创建更松散耦合的代码。当一个类而不是新建它自己的依赖项而不是接受它的依赖项时,该类变得更加简单,可以作为一个单元进行测试( 单元测试 )。
为了进一步阐述松散耦合 - 这个想法是类依赖于抽象,而不是结构。如果类 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
类,它现在依赖于 IB
。A
类不再有责任新建自己的依赖 - 现在必须提供给 A
。