控制反转(IoC)、依赖注入(DI)、Autofac

控制反转(IoC)、依赖注入(DI)、Autofac

 

1、 控制反转(IoC)

控制反转(Inversion of Control)又称IoC,很多资料上会把控制反转和依赖注入(DI)放在一起去说,自己在刚学的时候一直认为他们是等同的概念,导致误入歧途。百度百科上对控制反转的解释是:控制反转(Inversion of Control,英文缩写为IoC)把创建对象的权利交给框架,是框架的重要特征,并非面向对象编程的专用术语。它包括依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。

控制反转是一种思想,有的地方也叫设计模式。控制反转的思想是把创建对象的权利由调用者转变为提供者。什么意思呢?我们在程序之中会经常去创建对象(new object()),如果把对象当成一项服务,那么需要这项服务的就是调用者,提供这项服务的就是提供者。举个例子:我们都知道“一骑红尘妃子笑”的故事,在这个故事中想吃荔枝的杨贵妃就是调用者,荔枝就是服务的提供者。但是荔枝远在千里之外,杨贵妃要想吃到荔枝需要安排人快马加鞭给他运过来。那么运送的过程就是创建服务对象的过程,杨贵妃想吃到荔枝就需要自己去控制运送。这就是经典的调用者创建服务的过程。那么控制反转呢?顾名思义,就是把控制权进行反转。服务的提供者来创建服务对象,调用者在需要的时候直接调用。也就是说荔枝摘下来的时候就运到宫中冷窖保存,等杨贵妃什么时候想吃就把荔枝拿出来。那么冷窖就是我们之后要说的容器。

既然控制反转只是一种设计的思想,那么实现这种思想的方式是什么呢?

依赖查找:容器提供回调接口和上下文条件给组件。EJB和Apache Avalon 都使用这种方式。这样一来,组件就必须使用容器提供的API来查找资源和协作对象,仅有的控制反转只体现在那些回调方法上(也就是上面所说的 类型1):容器将调用这些回调方法,从而让应用代码获得相关资源。

依赖注入:组件不做定位查询,只提供普通的Java方法让容器去决定依赖关系。容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)

2、 依赖注入(DI)

现在常用的实现控制反转的方式是依赖注入。依赖注入意思就是把对象之间的依赖关系注入到IoC容器中。这样做的目的就是为了解耦,以实现软件设计的高内聚,低耦合。

依赖注入的方式有以下三种。

构造函数注入:

在构造期间完成一个完整的、合法的对象。所有依赖关系在构造函数中集中呈现。依赖关系在构造时由容器一次性设定,组件被创建之后一直处于相对“不变”的稳定状态。只有组件的创建者关心其内部依赖关系,对调用者而言,该依赖关系处于“黑盒”之中。

Setter注入:

对于习惯了传统 javabean 开发的程序员,通过 setter 方法设定依赖关系更加直观。如果依赖关系较为复杂,那么构造子注入模式的构造函数也会相当庞大,而此时设值注入模式则更为简洁。如果用到了第三方类库,可能要求我们的组件提供一个默认的构造函数,此时构造子注入模式也不适用。

接口注入:

接口注入模式因为具备侵入性,它要求组件必须与特定的接口相关联,因此并不被看好,实际使用有限。

3、 Autofac使用

容器

IContainer对象是Autofac的容器。容器的创建通过ContainerBuilder对象的Build()方法来创建。
注入依赖关系
ContainerBuilder对象将依赖关系注入到IContainer容器之中。
生成对象
通过IContainer对象的Resolve<T>()方法来获取对象。
--未完待续,之后会通过实际的例子来说明Autofac的使用方式。
posted @ 2018-01-07 22:41  pzyzp  阅读(289)  评论(0编辑  收藏  举报