“依赖倒置”中的“倒置”是什么意思

我正在学习spring。 我理解dependency injection。 在某些地方我也看到它称为依赖倒置。 我知道为什么它被称为注射,但是“反转”是什么意思? 它实际上反转了哪种依赖?

好问题 – 单词inversion有点令人惊讶(因为,在应用DIP之后 ,较低级别的依赖模块现在显然不depend于更高级别的调用模块 – 调用者和依赖者现在通过额外的更松散耦合抽象)。

引用Robert C Martin的原始资料

人们可能会质疑为什么我使用“反转”这个词。 坦率地说,这是因为更多传统的软件开发方法,例如结构化分析和设计,倾向于创建软件结构,其中高级模块依赖于低级模块,其中抽象依赖于细节。 实际上,这些方法的目标之一是定义子程序层次结构,该层次结构描述了高级模块如何调用低级模块。 …因此,精心设计的面向对象程序的依赖结构相对于通常由传统程序方法产生的依赖结构是“反转的”。

在阅读Uncle Bob关于DIP的论文时要注意的一点是,C ++没有(并且在编写时,仍然没有 )具有接口,因此在C ++中实现这种抽象通常是通过抽象/纯虚拟基类实现的。而在Java或C#中,放松耦合的抽象通常是通过从依赖项中抽象接口,并将更高级别的模块耦合到接口来解耦。

编辑只是为了澄清:

“在某些地方,我也看到它被称为依赖倒置”

请注意, dependency injection(DI)是实现依赖性倒置原则(DIP)的可能实现之一 – SOLID设计原则中的“D” ,因此DIDIP 完全可互换。

其他DIP实现包括服务定位器模式 (现在通常被视为反模式); 和插件 。

反转:将依赖关系管理从应用程序转换为容器(例如Spring)。

dependency injection:

而不是编写工厂模式,如何直接将对象注入客户类。 因此,让客户类引用接口,我们应该能够将具体类型注入到客户类中。 有了这个,客户类不需要使用new关键字,并且与具体类完全分离。

在此处输入图像描述

那么控制反转(IoC)又是什么呢?

在传统编程中业务逻辑流程静态分配给彼此的对象确定。 通过控制反转流程取决于由汇编程序实例化的对象图,并且通过抽象定义的对象交互使其成为可能。 绑定过程是通过dependency injection实现的 ,尽管有些人认为使用服务定位器也提供了控制反转。

作为设计指南的控制反转具有以下目的:

  • 将某个任务的执行与实现分离开来。
  • 每个模块都可以专注于它的设计目标。
  • 模块不会假设其他系统的function,而是依赖于他们的合同。
  • 更换模块对其他模块没有副作用。

有关详细信息,请查看:

设计模式IOC和DI

设计模式 – 控制反转和dependency injection

控制反转实用介绍

Spring框架中的控制反转(IoC)和dependency injection(DI)模式以及相关的面试问题