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

Rob*_*nik 66 dependency-injection ioc-container decoupling

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

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

解耦谈论同样的事情以及如何实现它.但是我们的IoC容器会让事情变得更糟.为什么它们不是称为依赖性反转容器或更好的依赖注入容器,因为它们服务于独立组件的运行时耦合?

然后我们有控制反转.这与Dependency Inversion基本相同,不是吗?为什么有三个术语描述同一个东西?还是我失明了?

  1. 三者有什么区别?
  2. IoC在IoC容器中需要做什么?

Mar*_*age 70

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

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

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

但是有什么IoC容器可以控制反转?引用Martin Fowler的话:

控制反转过于笼统,因此人们会发现它令人困惑.结果与各种IoC倡导者进行了大量讨论,我们选择了Dependency Injection这个名称.

(请注意,Martin Fowler讨论了依赖注入,而不是依赖反转.)

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

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


Bor*_*vić 47

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

  • 它是****反转控制**或它是**虽然依赖倒置**?我会说这是后者. (4认同)
  • 嗯...依赖注入是控制反转的一种形式,但它不一定能实现很多解耦.依赖性反转是实现解耦的原因,并且通过使用依赖注入和控制容器的反转来促进.有用甚至更令人困惑? (4认同)
  • @Mauricio:我认为**依赖注入**不是**解耦**或解耦技术.DI提供用于耦合去耦组件的装置.不是相反. (2认同)

hid*_*dro 17

我找到下面的说明野生的DIP文章martinfowler.com简单易懂(这里DI =依赖注入,DIP =依赖倒置原则,国际奥委会控制=反转):

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

另一方面,DIP是关于从代码发送到它正在调用的东西的消息中的抽象级别.(...)DI是关于布线,IoC是关于方向的,DIP是关于[代码所依赖的对象]的形状.

  • "DI是关于布线,IoC是关于方向的,而DIP是关于[代码所依赖的对象]的形状." 这句话很好;) (3认同)
  • 我发现最后一句中的“形状”一词令人困惑。除了已经声明的内容之外,它似乎没有添加任何内容:DIP 是关于抽象的。我想说,IoC 是关于_who_,DIP 是关于_what_,DI 是关于_how_。**谁**控制着依赖关系?**什么**是由依赖项抽象出来的?**如何**交付依赖项? (2认同)