Dependency injection 区别于;“控制权倒置”&引用;依赖倒置“;及;“脱钩”;

Dependency injection 区别于;“控制权倒置”&引用;依赖倒置“;及;“脱钩”;,dependency-injection,ioc-container,decoupling,Dependency Injection,Ioc Container,Decoupling,我正在阅读关于依赖倒置和解耦的理论,我看不出两者之间的区别 依赖项反转讨论解耦功能组件,以便更高级别的组件不依赖于较低级别的组件 解耦谈论同样的事情以及如何实现它。但是我们有IoC容器,它会把事情搞得更糟。为什么它们不被称为依赖项反转容器或更好的依赖项注入容器,因为它们服务于独立组件的运行时耦合 然后我们有控制反转。这基本上和依赖倒置是一样的,不是吗?为什么有三个术语描述同一事物?还是我瞎了 三者之间的区别是什么 IoC在IoC容器中必须做什么 依赖注入使用控制反转实现解耦解耦是一个非常普遍的原

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

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


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

然后我们有控制反转。这基本上和依赖倒置是一样的,不是吗?为什么有三个术语描述同一事物?还是我瞎了

  • 三者之间的区别是什么
  • IoC在IoC容器中必须做什么

  • 依赖注入使用控制反转实现解耦解耦是一个非常普遍的原则,适用于许多领域依赖项反转是一种特定的解耦形式,通过将系统的较高级别与较低级别分离到库中并使用接口,从而将它们解耦。这允许您在不进行重大返工的情况下更换系统的较低级别部件

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

    控制反转是框架库使用的一种设计原则,允许框架从应用程序中重新获得一些控制权。即,当某些用户界面事件发生时,窗口化框架可能会回调到应用程序代码中。马丁·福勒在《不要打电话给我们,我们会打电话给你》中使用了好莱坞原则这一术语。解耦是控制反转的重要组成部分

    但是,IoC容器与控制反转有什么关系

    控制反转这个术语太笼统了,因此人们感到困惑。因此,经过与各种国际奥委会支持者的大量讨论,我们最终确定了名称依赖注入

    (请注意,Martin Fowler谈论的是依赖项注入,而不是依赖项反转。)

    IoC容器有助于实现依赖项注入,也许更好的术语是依赖项注入容器。然而,IoC容器的名称似乎仍然存在。依赖项注入是依赖项反转中的一个重要组件,但是使用IoC容器进行依赖项注入可能会令人困惑,因为控制反转是一个更广泛、更通用的原则


    您指出,命名并不十分一致,但这并不令人惊讶,因为这些术语是独立发明和使用的,尽管它们相互重叠。

    我发现martinfowler.com上文章中的以下解释很容易理解(这里DI=依赖注入,DIP=依赖反转原理,IoC=控制反转):

    DI是关于一个对象如何获得依赖关系 如果是外部提供的,那么系统将使用DI。IoC是关于谁的 发起呼叫。如果代码发起呼叫,则不是IoC,如果 容器/系统/库回调到您提供的代码中 是的,是国际奥委会

    另一方面,DIP是关于模型中的抽象级别 从代码发送到它正在调用的对象的消息。(…)DI是关于 布线,IoC是关于方向,DIP是关于物体的形状 代码所依赖的


    依赖倒置:依赖于抽象,而不是具体化

    控制反转:主与抽象,以及主如何成为系统的粘合剂

    以下是一些谈论这一点的好帖子:


    @Anton Gogolev:解耦是用额外的“o”来拼写的:它被认为是控制反转还是依赖反转?我认为是后者。-1这实际上将术语“依赖注入”与“控制反转”结合起来了。依赖项注入本身就是一种解耦技术。@Mauricio:我认为依赖项注入根本不是解耦或解耦技术。DI提供了耦合解耦组件的方法。反之亦然。嗯……依赖项注入是控制反转的一种形式,但不一定能实现很多解耦。Dependency Inversion是实现解耦的工具,通过使用依赖项注入和控制容器的反转来实现。这很有用,甚至更令人困惑?jeez说得够多了:(这是一篇好文章Boris。做任何事情的方法太多了。重要的是团队内部的信任和尊重。从最纯粹的角度来看,如果团队合作是最佳的,并且对自己的工作有信心,那么软件设计原则和相关书籍就没有用了。我同意,尽管我不会使用IoC conta这个词因为正如你所说,它不是真正正确的。我认为遵循(不正确的)流行命名方案并不重要,因为任何理解DI容器原理的人都应该能够理解正确的命名。“DI是关于布线,IoC是关于方向,DIP是关于[代码所依赖的对象]的形状。”这是一个好句子;)在最后一句中,我发现单词的形状令人困惑。它似乎没有添加任何超出已经陈述的内容:DIP是关于抽象的。我想说,IoC是关于谁,DIP是关于什么,DI是关于如何。谁控制依赖关系?依赖关系抽象了什么?依赖关系是如何传递的?