zoukankan      html  css  js  c++  java
  • 简单理解IOC控制反转和DI依赖注入

    用过.net core框架的同学都知道,框架默认支持“构造函数”注入引用对象的方式。使用.net core框架也有一段时间了,最近去了解了一下到底什么是“依赖注入”,而往往谈到依赖注入,必然绕不开“控制反转”。

    网上对它们也是众说纷纭,今天基于自己的理解,和大家简单交流下。

    “控制反转”(Inversion of Control)IOC

    先提出两个问题:

    1.有反转肯定有正转吧?

    2.哪些方面的控制被反转了?

    好了,带着上面的问题,我们一边说一边思考,进入如下场景。

    有两个类class A和class B分别实现不同的逻辑,classA需要引用classB,调用B中的某个方法。

    “控制正转”:也就是我们实现对象引用的常用模式,classA要想获取对classB对象的引用,需要在classA类中直接new 一个classB的对象,以持有对classB的对象。

    //添加classB对象的引用
    ClassB objB=new ClassB();
    //调用B的方法
    objB.Get();

    直接new了一个对象,同时也建立了classA和classB之间的耦合关系,在如今越来越强调“低耦合”的业务场景下,显然是有点影响系统可扩展性。于是,出现了“控制反转”。

    “控制反转”:相比于“控制正转”获取对象引用直接new的实现方式,控制反转将获取对象引用的实现交给了容器统一管理。类似于设计模式中的“工厂模式”,由容器统一实例化引用对象。

    实际上也就是“获取引用对象的方式发生了转换”,由之前的调用者classA直接new一个classB对象引用,变成后来的由外部系统注入引用对象。如:classA通过构造函数接收classB的引用对象,外部调用时传入B对象,classA只是被动的等待classB引用对象,不再主动创建。

    //创建classB私有对象
    private readonly ClassB _objB;
    //构造函数注入classB引用对象
    public ClassA(ClassB objB)
    {
       _objB=objB;
    }
    //调用classB方法
    public string GetA()
    {
       _objB.Get();
    }

    “依赖注入”(DependencyInjection)DI

    在程序运行过程中,动态的向某个对象提供它所需要的其他引用对象。简单理解:依赖=引用对象,注入=添加方式,也就是指添加引用对象的方式。通常由容器统一管理引用对象的实例化。

    实现方式,主要包括:属性注入和构造函数注入。

    大家可以看到,在谈到控制反转的时候,也已经提到了“依赖注入”,实际上我们可以把“依赖注入”看成是“控制反转”的一种实现方式,两者实际上是同一个事情,只是从不同角度的描述而已

  • 相关阅读:
    利用Delegator模式保护javascript程序的核心与提高执行性能 (转)
    工作流
    蓝色垂直滑动效果的CSS导航
    JavaScript 多级联动浮动菜单 (第二版) (转)
    虚线效果水平CSS菜单
    红色玻璃效果水平CSS菜单
    CSS绿色水平多级下拉菜单
    ASP.NET中的Path(转)
    黑色与红色形成的水平CSS导航菜单
    紫罗兰水平CSS菜单
  • 原文地址:https://www.cnblogs.com/chenxf1117/p/14735393.html
Copyright © 2011-2022 走看看