关于ioc容器:“控制反转”,“依赖倒置”和“解耦”之间的区别

Difference between “Inversion of Control”, “Dependency inversion” and “Decoupling”

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

依赖倒置讨论了功能组件的去耦,以便更高级别的组件不依赖于较低级别的组件。

"脱钩"指的是同一件事以及如何实现它。但是我们有IOC容器,它们会把事情搞得更糟。为什么它们不更称为依赖倒置容器,甚至更好的依赖注入容器,因为它们服务于独立组件的运行时耦合?

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

  • 这三者有什么区别?
  • 国际奥委会必须在国际奥委会的容器中做什么?

  • 去耦是一个非常普遍的原则,适用于许多领域。依赖倒置是一种特殊的解耦形式,通过将系统的高层与底层分离到库中并使用接口,可以将它们与底层分离。这允许您更换系统的较低级别的部件,而无需进行重大返工。

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

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

    但是IOC容器与控制反转有什么关系呢?引用马丁·福勒的话:

    Inversion of Control is too generic a term, and thus people find it confusing. As a result with a lot of discussion with various IoC advocates we settled on the name Dependency Injection.

    (注意,MartinFowler谈到依赖注入,而不是依赖倒置。)

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

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


    依赖注入通过控制反转实现解耦。


    我在martinfowler.com上的一篇野生文章中发现了下面的解释,这很容易理解(这里di=依赖注入,dip=依赖倒置原理,ioc=控制反转):

    DI is about how one object acquires a dependency. When a dependency is
    provided externally, then the system is using DI. IoC is about who
    initiates the call. If your code initiates a call, it is not IoC, if
    the container/system/library calls back into code that you provided
    it, is it IoC.

    DIP, on the other hand, is about the level of the abstraction in the
    messages sent from your code to the thing it is calling. (...) DI is about
    wiring, IoC is about direction, and DIP is about shape [of the object
    upon which the code depends].


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

    控制反转:主与抽象,以及主是如何粘合系统的。

    DIP and IoC

    以下是一些关于这方面的好文章:

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

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

    Inversion of Control: Putting All Together