什么是依赖注入?

20 浏览
0 Comments

什么是依赖注入?

已经有几个问题发布了具体关于依赖注入的问题,例如何时使用它以及有哪些框架可用。然而,

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

admin 更改状态以发布 2023年5月21日
0
0 Comments

依赖注入是将依赖传递给其他对象框架(依赖注入器)的过程。
依赖注入使得测试更加容易。注入可以通过构造函数完成。
SomeClass() 的构造函数如下:

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

问题
如果myObject涉及到像磁盘访问或网络访问这样的复杂任务,那么在SomeClass()上进行单元测试是困难的。程序员必须模拟myObject并可能拦截工厂调用。

替代解决方案

  • myObject作为参数直接传递给构造函数

public SomeClass (MyClass myObject) {
    this.myObject = myObject;
}

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

  • 一个常见的替代方案是定义一个空构造函数。依赖注入可以通过setter完成。(h/t @MikeVella)。
  • Martin Fowler记录了第三种选择的替代方案(感谢@MarcDix),其中类明确实现了接口以获得需要注入的依赖项。

在没有依赖注入的情况下,将组件隔离进行单元测试更加困难。

在2013年,当我写下这个答案时,这是Google测试博客的一个主要主题。对我来说,这仍然是最大的优势,因为程序员在运行时设计中并不总是需要额外的灵活性(比如,对于服务定位器或类似模式)。在测试期间,程序员经常需要隔离类。

0
0 Comments

目前我找到的最好的定义是由James Shore提出的

"依赖注入"是一个价值25美元的术语,用来描述一个5分的概念[...] 依赖注入意味着将一个对象的实例变量传递给它。[...]

另外,Martin Fowler的一篇文章也可能会有所帮助。

依赖注入基本上是提供对象所需的其他对象(即它所依赖的对象),而不是让对象自己构造这些对象。这是一种非常有用的测试技术,因为它允许依赖被模拟或替换。

依赖关系可以通过多种方式(例如构造函数注入或设置函数注入)注入到对象中。人们甚至可以使用专门的依赖注入框架(例如Spring)来实现这一点,但它们当然不是必需的。你不需要这些框架来进行依赖注入。通过明确实例化和传递对象(依赖项),这与框架注入一样好。

0