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

2 篇文章 0 订阅
1 篇文章 0 订阅

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://github.com/isdaniel/IOC_Sample

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值