电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

对IOC和DI的理解


发布日期:2020/8/15
 

首先说一下什么是IOC和DIIOC是Inversion of Control(控制反转)的简写DI是Dependency Injection(依赖注入)的简写martinfowler对IOC的解释为Inversion of control is a common characteristic of frameworks so saying that these lightweight containers are special because they use inversion of control is like saying my car is special because it has wheels

我想对这一概念进行一个个人的阐述以方便我的理解控制反转从字面意思来看就是控制权由被动变主动又变为被动或被动变主动又变为被动从这个角度来说IOC就变得非常容易理解了

举个例子你的主管要求你做一件事情这个时候就存在这么几个过程

主管命令你做事情(这个时候主动权在主管你是被动的)

你接到命令做事情(这个时候主题是你你是主动的控制权在你手里)

你完成事情(这个时候主题依然是你控制权在你手里)

报告主管做完事情(主动权又叫交到主管手里了)

上面的整个过程就完成了一次IOC从上面可以看出IOC的基本思想是控制权的转换过程

举个代码的例子

假如有Class AClass B在A内部会初始化一个B调用B的一个方法DoMethod

public Class B

{

public void DoMethod()

{

/// do somthing

}

}

public Class A

{

public void Excute()

{

B b = new B()

bDoMethod()

}

}

假如在Main函数中如下执行

A a = new A()

aExcute()

从这两行代码来看事实上也存在一个IOC的过程a——>b——>a理解的关键点就在在A的内部调用Excute的时候方法bDoMethod的执行

理解了IOC我们再看一下DI从上面A调用B我们可以看出在初始化一个A的实例时也必须实例化一个B也就是说如果没有B或者B出了问题A就无法实例化这就产生了一种依赖就是A依赖B这种依赖从设计的角度来说就是耦合显然它是无法满足高内聚低耦合的要求的这个时候就需要解耦当然解耦有很多种方法而DI就是其中一种不管任何一种解耦方法都不是说使A和B完全没有关系而是把这种关系的实现变得隐晦不那么直接但是又很容易实现而且易于扩展不像上面的代码那样直接new一个B出来那为什么我们总是把IOC和DI联系到一起呢?是因为DI的基本思想就是IOC而体现IOC 思想的方法还有另外一个那就是Service Locator这个方法好像涉及到的很少

DI依赖注入从字面意思就可以看出依赖是通过外接注入的方式来实现的这就实现了解耦而DI的方式通常有三种

构造器注入

属性设置器注入

接口注入(我感觉接口注入是同时存在于上两种注入方式的而不应该独立出来)

以上的阐述只是为了先让我们能对IOC和DI有一个感性的理解那么IOC他真正解决的问题是什么呢?我们讲了那么多主动被动的问题那我们是从什么视角来看待这个问题的呢?所谓为什么你是主动而我不是主动呢?这就需要一个参照物那这个参照物是什么呢?就是容器在容器中来体现主动和被动用白话来讲就是由容器控制程序之间的关系而非传统实现中由程序代码直接操控这也就是所谓控制反转的概念所在控制权由应用代码中转到了外部容器控制权的转移是所谓反转这是通常对IOC的一个解释从容器的角度来看主动和被动和由容器来控制程序之间的关系应该是相通的是一个意思到这里我们就应该基本明白了IOC要解决的就是程序之间调用的一个问题它应该是一个思想层面的东西是一个中心就像一支乐队的指挥而程序就是乐器通过指挥来协调各种乐器来演奏出美好的音乐来

上一篇:老生常谈:迭代器模式

下一篇:老生常谈:桥接模式