控制反转与依赖性反转有何关系


11

在网络上的许多文章中,术语“控制反转”和“依赖反转原则”似乎混为一谈并用作同义词(进一步的混乱由称为“ DI-Containers”和“ IoC-Containers”的工具所强加)。Wikipedia的一篇文章很好地解释了IoC与DI不同:

控制反转(IoC)描述了一种设计,其中计算机程序的自定义编写部分从通用的可重用库接收控制流

因此,DIP是关于让模块依赖于抽象而不是具体的实现。

而IoC则是将程序流的控制权交给一个单独的模块。您可以让此模块执行的操作之一是在运行时解析依赖关系。

这种差异看起来确实很公平,但是我从未见过有人提到过IoC原理的任何其他应用程序,除了依赖关系解析之外。Wikipedia的定义非常广泛,似乎您可以使用一个模块进行更多的工作,该模块可以根据其配置和一些内部逻辑调用自定义代码。

因此,这里有一些我还无法弄清楚的问题:

  • IoC和DIP之间的实际关系是什么?IoC始终是实现DIP的手段吗?
  • 为什么将依赖关系解决工具称为DI容器和IoC容器?这意味着DI和IoC是同一件事。

注意:这个问题不是DI和IoC什么区别的重复,因为后者询问的是依赖注入,而不是依赖反转。



@gnat,不,不是,请查看我的编辑
Andre Borges

同意,我错过了遗憾
蚊蚋

2
海事组织,简单的答案是“他们是相同的”。IoC是依赖关系反转的另一个名称,两者都是实现依赖关系注入的一种方式。我将“依赖倒置”视为一个非常无用的术语,因为它很容易与注入混淆。因此,有DI(注入)和IoC是一种通过注入实现依赖关系/控制反转的方法。
David Arno

Answers:


6

Martin Fowler的网站上有一篇很棒的文章,其中有一章专门介绍DIP,DI和IoC之间的区别。其要点(从该站点复制)是

DI与一个对象如何获取依赖关系有关。当从外部提供依赖项时,则系统正在使用DI。IoC与谁发起呼叫有关。如果您的代码发起了调用,则不是IoC,如果容器/系统/库回调回您提供的代码,则为IoC。

另一方面,DIP大约是从代码发送到正在调用的事物的消息中的抽象级别。可以肯定的是,将DI或IoC与DIP结合使用往往更具表现力,功能强大且与领域保持一致,但是在整个问题中,它们具有不同的维度或作用力。DI与布线有关,IoC与方向有关,DIP与形状有关。


2
IoC涉及谁发起呼叫 - 谁发起对什么的呼叫?如果我写的ISomeInterface object = container.Resolve<ISomeInterface>()是不是IoC?
安德烈·博尔赫斯

1
您编写的是服务定位器模式中的实现。这也是IoC。不是IoC是ISomeInterface对象= new MyClass()。因此,这意味着“实例化调用”(或称为“新”的调用)。
Sjoerd222888 '16

1
“另一方面,DIP涉及从代码发送到它所调用的事物的消息中的抽象级别。” 听起来对我来说是胡说八道。倒置在哪里?他在描述依赖抽象,而不是反转。
David Arno

@DavidArno,您是说我们不能相信Martin Fowler的网站吗?
holdenmcgrohen

@holdenmcgrohen,这是他对事情的看法。仅仅因为是马丁·福勒(Martin Fowler),就没有把它变成事实。在IMO时期,他是错误的,例如在“贫血数据模型”方面。其他时候,他很有见识。这次我认为他也错了,因为这没有道理。
David Arno
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.