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

C#教程 ASP.NET教程 C#视频教程程序源码享受不尽 C#技术求助 ASP.NET技术求助

【源码下载】 社群合作 申请版主 程序开发 【远程协助】 每天乐一乐 每日签到 【承接外包项目】 面试-葵花宝典下载

官方一群:

官方二群:

设计原则—IOC(Inversion of Control)

  [复制链接]
查看5646 | 回复9 | 2021-3-9 17:19:29 | 显示全部楼层 |阅读模式
本帖最后由 剑弑 于 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)







ibcadmin | 2021-3-9 20:26:38 | 显示全部楼层
11111
C#论坛 www.ibcibc.com IBC编程社区
C#
C#论坛
IBC编程社区
huok | 2021-3-10 13:29:42 | 显示全部楼层
*滑块验证:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则