请选择 进入手机版 | 继续访问电脑版

马上加入IBC程序猿 各种源码随意下,各种教程随便看! 注册 每日签到 加入编程讨论群

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#问题入口 ASP.NET问题入口

【C#问题提交】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接毕业设计】 面试-葵花宝典下载

官方一群:

官方二群:

查看: 1059|回复: 2

设计原则—IOC(Inversion of Control)

[复制链接]
  • TA的每日心情
    开心
    2019-8-30 08:53
  • 签到天数: 198 天

    [LV.7]常住居民III

    49

    主题

    215

    帖子

    5912

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    5912
    QQ
    发表于 2021-3-9 17:19:29 | 显示全部楼层 |阅读模式

    马上加入IBC,查看更多教程

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本帖最后由 剑弑 于 2021-6-25 14:04 编辑

        IOC,大家对它或多或少都听说过,也都可能用到过,但到底IOC是什么呢?IOC的作用是什么?有什么优缺点呢?    在学习之前跟大家讲个很Low的事,就在昨天我去到一家公司面试,因为我自己简历有写用过IOC,理所当然的面试官问我"为什么要用IOC呢?我直接new一个不是更快吗?何必要去使用IOC去生成类实例呢?";当时的我居然回答不上来,只知道IOC是有一个控制集合(IOC容器),当我们要使用某个类时,就从这个控制集合里面获取到对象;当时场景搞得自己异常尴尬,想想毕竟是自己写的技术栈里面的技术,自己又确实有使用过,但又回答不上,那感觉简直Low爆了。
         好了,让我们回到正题,
         到底IOC是什么呢?
         IOC(Inversion of Control,缩写为IOC,也译为控制反转),是面向对象编程中的一种设计原则;主要用于减少对象间的耦合度,使我们代码的复杂度降低,提高代码的复用性和扩展性。
         IOC的作用是什么呢?
         让我们来看看下面这张图:
       

    图1

    图1

         我们都知道一个系统是由N个对象组成,这N个对象间各自通过合作,从而形成我们的一套系统;我们把上面这张图表示为我们的系统,每一个类都有自己的依赖类,一环接一环,甚至还形成了闭环;这样我们要更改一个其中的一个类对象,我们的代码量可能就是把整个系统都进行修改,伴随着我们系统的越来越大,复杂度就越来越高,牵一发而动全身。
        针对以上的这种情况,我们IOC到底能给我们带来怎样的惊喜呢?它到底做了什么呢?
        同样的我们先来看看下面的这张图:
         

    图2

    图2

         看到图的第一感觉是不是简单多了,不会像前面一样类与类之间随意依赖,所有类都依赖于IOC容器,有了针对对象的统一管理。没错IOC就是让类通过IOC容器去生成需要的对象返回,从而达到解耦的目的。这也就是IOC控制反转;这时候有朋友就会问了,控制反转?哪里说了控制反转?到底控制反转是怎样的,你让我很蒙圈?
        蒙圈就对了,因为我还没说到控制反转
        哪么控制反转是什么呢?从图1我们可以看出类A依赖类B,类A想要使用类B的实例,就必须去new一个类B的对象,此时控制权在类A手中;但我们图2的类都是依赖于IOC容器的,所以类A当需要使用类B时,IOC容器就会主动创建类B对象注入到类A,达到了将控制权颠倒了过来,这就是所谓的控制反转
       经过图1跟图2解读我们可以得出以下这样的一个结论:
       作用:“IOC是借助于第三方(IOC容器)实现具有依赖关系的对象之间的解耦“。
       至此,昨天面试的问题我就可以熟练的回答了:
       因为使用IOC能让我们给对象间进行解耦,有效得降低我们系统间的复杂度,从而提高了我们解决Bug效率和提高了系统的扩展性,这些是直接使用New达不到的;虽然New会更快更节省内存,但相对于IOC带来的好处这点性能损耗是可以接受的。
        哪么IOC依赖注入又是什么回事?我公司大牛一说IOC都是说"IOC控制反转,依赖注入"的,可能会有朋友会这么问。
        其实依赖注入和控制反转是从不同的角度去描述同一件事,就是指通过使用IOC容器,利用依赖关系的注入解决对象之间的耦合。
        有什么优缺点呢?
         优点:对象之间进行了解耦(毕竟我们都提倡松耦合),降低复杂度,提高了扩展性,同时也变相的提高了Bug解决率;
         缺点:提高了创建一个对象的性能损耗,虽然不太高;因为多了一个IOC容器的步骤,也变相的提高了创建一个对象实例的复杂度,所以必须要求项目同事要有一定的IOC知识。
         题外补充:
         IOC基础技术是通过反射进行对象的实例化,而反射说白了就是通过类名找到对应的类来动态生成对象。
         IOC的表现形式有多种实现,可以是设值注入,接口注入、构造器注入等,想了解更多可以看看深度理解依赖注入(Dependence Injection)







  • TA的每日心情
    开心
    4 天前
  • 签到天数: 1838 天

    [LV.Master]伴坛终老

    4254

    主题

    6209

    帖子

    12万

    积分

    管理员

    IBC编程社区-原道楠

    Rank: 9Rank: 9Rank: 9

    积分
    125511

    推广达人突出贡献优秀版主荣誉管理论坛元老

    发表于 2021-3-9 20:26:38 | 显示全部楼层
    11111
    C#论坛 www.ibcibc.com IBC编程社区
    C#
    C#论坛
    IBC编程社区
  • TA的每日心情
    慵懒
    2021-9-29 12:41
  • 签到天数: 242 天

    [LV.8]以坛为家I

    4

    主题

    18

    帖子

    7117

    积分

    论坛元老

    Rank: 8Rank: 8

    积分
    7117
    发表于 2021-3-10 13:29:42 | 显示全部楼层
    *滑块验证:
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则