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协议共用的合约