依赖注入(DI)和控制反转(IOC)之间的区别

我已经看到很多关于依赖注入(DI)和控制反转(IOC)的参考,但我不知道它们之间是否存在差异。

我想开始使用它们中的一个或两个,但我对它们的不同有点困惑。


定义

控制反转是一种设计范例,其目标是降低应用程序框架代码对具体实现的认识,并对应用程序的特定领域组件进行更多控制。 在传统的自顶向下设计系统中,应用程序和依赖意识的逻辑流程从顶层组件(首先设计的组件到最后设计的组件)流动。 因此,控制反转几乎是应用程序中控制和依赖意识的字面逆转。

依赖注入是一种模式,用于创建其他类依赖的类的实例,而无需知道在编译时哪个实现将用于提供该功能。

一起工作

控制反转可以利用依赖注入,因为需要一种机制来创建提供特定功能的组件。 其他选项存在并且被使用,例如激活器,工厂方法等,但是当框架类可以接受它们需要的依赖关系时,框架不需要引用那些实用类。

例子

工作中这些概念的一个例子是Reflector中的插件框架。 尽管应用程序在编译时对插件没有任何了解,但插件对系统有很大的控制权。 每个插件都会调用一个方法,如果内存用于初始化,则将控制权交给插件。 该框架不知道他们会做什么,它只是让他们做。 从主要应用程序中取得控制权并交给执行特定工作的组件; 控制反转。

应用程序框架允许通过各种服务提供者访问其功能。 插件在创建时被赋予服务提供者的引用。 这些依赖性允许插件添加自己的菜单项,改变文件的显示方式,在适当的面板中显示自己的信息等等。由于依赖关系是通过接口传递的,所以实现可以改变并且改变不会破坏代码只要合同保持不变。

此时,使用工厂方法使用配置信息,反射和Activator对象(至少在.NET中)创建插件。 今天,有一种工具MEF,它可以在注入依赖包时提供更广泛的选择,包括应用程序框架接受插件列表作为依赖的能力。

概要

虽然这些概念可以独立使用并提供独立的优势,但它们可以共同编写更灵活,可重用和可测试的代码。 因此,它们是设计面向对象解决方案的重要概念。


好文章了解IOC和DI http://martinfowler.com/articles/injection.html

IOC(控制反转)

国际奥委的手段

  • 编码到接口(一个组件应该依赖于其他组件的接口而不是impl),例如

    interface iComp_2 {...}
    
    class Comp_1 {
        iComp_2 c2 = ….;
    }
    
  • 删除组件实现特定的代码,例如

    Comp_1 {
        iComp_2 c2 = getComp_2_Impl(); // not new Comp_2_Impl();
    }
    
  • 国际奥委会可以通过以下任何一种方式实现:

    1. DI(依赖注入)

    3 types of DI
    
    1.1 Constructor Injection
    
    1.2 Setter Injection
    
    1.3 Interface Injection
    

    2.服务定位器

    DI(依赖注入)容器

    Runtime确定impl而不编译时间:在运行时确定基于某个配置文件使用哪个接口的具体实现(因此在编译时我们不知道将使用哪个impl并因此增加了应用程序的可配置性) 。 这是一个在“运行时间”决定不同模块之间具体关系的实现。

    在依赖注入之后实例化impl:在确定impl之后,它通过首先创建它的所有依赖项(在配置文件中指定)来实例化impl,然后将这些依赖项注入那个impl

    实例生命周期管理:DI容器通常只保留对管理生命周期所需的对象的引用,或者将来用于未来注入的重用对象,如单身人士或飞锤。 当配置为每次调用容器时创建一些组件的新实例时,容器通常只是忘记创建的对象。 否则,垃圾收集器很难在不再使用时收集所有这些对象。


    我会说“控制反转”是设计一个系统的一种方式,所有模块都被认为是抽象实体。

    并且,“依赖注入”是在“运行时间”决定不同模块之间的具体关系的实现。

    链接地址: http://www.djcxy.com/p/82057.html

    上一篇: Difference between Dependency Injection (DI) and Inversion of Control (IOC)

    下一篇: When to use Dependency Injection