IOC(控制反转) , DI(依赖注入) 深入浅出~~

IOC是一个oop重要的程式设计思想。

此文带着大家初探 IOC(控制反转) , DI(依赖注入) ~~


案例解释:

小明是个爱乾净的人,但他工作时常加班导致

学一个技术或思想前我们必须先了解,这个技术或思想可为我们解决什么问题。

Ioc(Inversion of Control)控制反转

**控制反转是一个设计思想 **

简单解释

A物件程式内部需要使用B物件 A,B物件中有依赖的成份

控制反转把原本A对B直接控制权移交给由第三方容器

降低A对B物件的耦合程度,并让双方都倚赖抽象。

IoC经典实现对象设计法则 好莱坞法则:“别找我们,我们找你”

系统中模组建议依赖抽象,因为各个模组间不需要知道对方太多细节(实作),知道越多耦合越强。


DI—Dependency Injection 依赖注入

把被依赖物件注入被动接收物件中

案例解释:

小明是个爱乾净的人,但他工作时常加班导致房间杂乱,他不能忍受此状况,所以小明去找一个清洁阿姨每天帮忙他打扫家里

哪天阿姨哪天有事不能打扫,小明就必须要再去找人来帮忙打扫,由此可知小明耦合阿姨


如果今天是....

小明把他要的条件给「打扫仲介公司」,仲介公司帮他寻找有没有符合小明需求的打扫阿姨,假如今天A阿姨请假了,仲介公司会自动找另一个符合需求B阿姨帮忙打扫...

原本小明需耦合于打扫阿姨,现在被「仲介公司」做了控制反转让「仲介公司」来提供打扫阿姨。

小明不用管是否今天有人会来打扫,「仲介公司」会帮小明找到一个扫地阿姨。

「仲介公司」可看作 依赖注入容器「小明」可看作 被动接收物件

「打扫阿姨」可看作 被依赖物件

在使用IOC容器前需先了解双方的依赖关係(谁依赖谁?)

上述还有一个很重要的观念是,依赖和被接收对象要倚赖抽象。


範例使用:VS2015

IOC容器:AutoFac

下面範例来说明上面的例子

小明自己依赖于扫地阿姨
依赖程式码写在小明类别内部日后要更改只能动内部程式码。

/// <summary>/// 小明直接依赖 Aunt 不是依赖抽象/// 日后要改必须动内部/// </summary>public class Mine{    public Aunt aunt = new Aunt();    public void Room()    {        aunt.Swapping();    }}

呼叫使用时

Mine mine = new Mine();mine.Room();

小明找仲介公司

仲介公司(Ioc容器)

在仲介公司内注册需求,让仲介公司日后帮你找人(注册的类别)

/// <summary>/// 仲介公司/// </summary>/// <returns></returns>private static IContainer MiddleCompany(){    ContainerBuilder builder = new ContainerBuilder();    //在仲介公司里写需求人申请单    builder.RegisterType<MineWithMiddle>();    //小明所需打扫阿姨需求    builder.RegisterType<Aunt>().As<ISwapable>();    return builder.Build();}

使用起来

IContainer middleCompany = MiddleCompany();//仲介公司(IOC AutoFac)自动帮小明注入一个打扫阿姨MineWithMiddle mineWithMiddle = middleCompany.Resolve<MineWithMiddle>();mineWithMiddle.Room();

总结:

虽然上面程式码执行结果一样,但内部结构和日后扩展性却截然不同

重点:系统中模组建议依赖抽象,因为各个模组间不需要知道对方太多细节(实作),知道越多耦合越强。

像网页浏览器和伺服器是依赖Http协议,用户端不管是手机.电脑,平板,伺服器端php,asp.net,java都可互相交信,依赖Http协议共用的合约

範例原始码

参考连结

此文同步发布小弟部落格 : https://isdaniel.github.io/ioc-di/


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章