“控制反转”,“依赖倒置”和“解耦”之间的区别

时间:2010-10-12 07:41:35

标签: dependency-injection ioc-container decoupling

我正在阅读关于依赖倒置解耦的理论,我看不出两者之间的区别。

依赖性反转讨论了解耦功能组件,以便更高级别的组件不依赖于更低级别的组件。

脱钩谈论同样的事情以及如何实现它。但是,我们有 IoC容器进一步搞砸了。为什么它们不是称为依赖性反转容器,甚至更好的依赖注入容器,因为它们服务于独立组件的运行时耦合?

然后我们有控制反转。它与依赖性倒置基本相同,不是吗?为什么有三个术语描述同一个东西?还是我失明了?

  1. 三者之间有什么区别?
  2. IoC容器中IoC必须做什么?

4 个答案:

答案 0 :(得分:62)

去耦是适用于许多领域的一般原则。 依赖性反转是一种特定的解耦形式,您可以将系统的较高级别与较低级别分离,将它们分离为库并使用接口。这使您可以在不进行重大返工的情况下更换系统的较低级别部件。

例如,不是系统的更高级别部分创建更低级别类的具体实例,而是可以使用IoC容器来分离对象的创建方式。

控制反转是框架库使用的设计原则,允许框架从应用程序中重新获得某些控制。即,当某些用户界面事件发生时,窗口框架可以回调到应用程序代码中。 Martin Fowler使用好莱坞原则一词,如不要打电话给我们,我们会打电话给你。解耦是控制反转的重要部分。

IoC容器与控制反转有什么关系? To quote Martin Fowler

  

控制倒置是一个过于笼统的术语,因此人们会发现它令人困惑。因此,经过与各种IoC倡导者的大量讨论,我们确定了名称Dependency Injection。

(请注意,Martin Fowler谈论依赖注入,而非依赖性反转。)

IoC容器有助于实现依赖注入,也许更好的术语是依赖注入容器。但是,IoC容器名称似乎坚持下去。依赖注入是依赖性反转的一个重要组成部分,但使用IoC容器进行依赖注入可能会令人困惑,因为控制反转是一个更广泛和更通用的原则。

你指出命名不是很一致,但这不应该是一个大惊喜,因为这些术语即使重叠也是独立发明和使用的。

答案 1 :(得分:46)

依赖注入使用控制反转实现解耦

答案 2 :(得分:15)

我从martinfowler.com上的DIP in the Wild文章中找到以下解释直接理解(此处DI =依赖注入,DIP =依赖性反转原则,IoC =控制反转):

  

DI是关于一个对象如何获得依赖关系的。当依赖是   在外部提供,然后系统使用DI。 IoC是关于谁的   发起呼叫。如果您的代码启动了一个呼叫,那么它不是IoC,如果   容器/系统/库调用回您提供的代码   它,是IoC。

     另一方面,DIP是关于抽象层次的   从您的代码发送到它正在调用的东西的消息。 (...)DI是关于   接线,IoC是关于方向的,而DIP是关于物体的形状   代码依赖于此。

答案 3 :(得分:0)

依赖倒置:依赖抽象,而不依赖具体。

控制反转:Main与Abstract,以及Main是系统的粘合剂。

DIP and IoC

这些是一些谈论这个的好帖子:

https://coderstower.com/2019/03/26/dependency-inversion-why-you-shouldnt-avoid-it/

https://coderstower.com/2019/04/02/main-and-abstraction-the-decoupled-peers/

https://coderstower.com/2019/04/09/inversion-of-control-putting-all-together/