问题

有几个问题已经发布了关于依赖注入的具体问题,例如何使用它和它的框架.但是,

什么是依赖注入,什么时候/为什么应该或不应该使用它?

  最佳答案

依赖注入将依赖关系传递给其他对象或框架(依赖注入器)。

依赖注入使测试更容易,注入可以通过构造函数完成。

SomeClass()的构造函数如下:

 public SomeClass() {
    myObject = Factory.getObject();
}
 

问题: 如果myObject涉及诸如磁盘访问或网络访问等复杂任务,则很难在SomeClass()上进行单元测试.程序员必须模拟myObject并可能拦截工厂调用.

替代解决方案:

  • myObject作为参数传递给构造函数
 public SomeClass (MyClass myObject) {
    this.myObject = myObject;
}
 

myObject可以直接传递,使测试更容易。

在没有依赖注入的单元测试中隔离组件更加困难。

2013年,当我写这个答案时,这是 Google Testing Blog 的主题.它仍然是我的最大优势,因为程序员在运行时设计中并不总是需要额外的灵活性(例如,服务定位器或类似模式).程序员常常需要在测试期间隔离类.