我们ITOO的服务端用到了IOC容器,用这个容器来管理D层和B层的引用,于是找了一些关于IOC容器的知识,再对照一下我们现在做的项目,简单的谈一谈我对IOC容器的理解与项目中的使用。
一、IOC简介
IOC英语原文:Inversion of Control中文翻译为:” 控制反转“
IOC的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些联系在一起。简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。
二、ITOO中用到的IOC
在ITOO中,我们利用IOC容器管理我们B层与D层的引用,这样我们将B层,D层、还有WCF层解耦。下面我说一下项目中IOC容器用到的知识。一个是依赖查找,一个是依赖注入。
先看看我们的web.config(配置文件)中描述的组件。当程序加载时,配置文件中的D层与B层的注解就会实例化一个个的类,而这些类的引用就装在一个Hash Table中,利用Hash Table中的键值对关系就能找到我们将要操作的引用。
我用基础系统的教学为例。
<spring> <context> <resource uri="config://spring/objects" /> </context> <objects xmlns="http://www.springframework.net"> <object id="BasicTeachEntities" type="ITOO.BasicTeach.Model.BasicTeachEntities,ITOO.BasicTeach.Model" singleton="false" /> <!--DbSession层的的注解--> <object id="DBSession" type="ITOO.BasicTeach.DAL.DbSession,ITOO.BasicTeach.DAL" singleton="false"> <!--加入属性注入,指向D层的注入--> <property name="BasicTimeTableEntityDaL" ref="BasicTimeTableEntityDaL" /> <property name="BasicOrganizationEntityDal" ref="BasicOrganizationEntityDal" /> <property name="BasicOnClassEntityDal" ref="BasicOnClassEntityDal" /> ... ... ... ... </object> <!--D层的的注解--> <pre name="code" class="html"> <object id="BasicTimeTableEntityDaL" type="ITOO.BasicTeach.DAL.BasicTimeTableEntityDaL,ITOO.BasicTeach.DAL" singleton="false" /> <object id="BasicOrganizationEntityDal" type="ITOO.BasicTeach.DAL.BasicOrganizationEntityDal,ITOO.BasicTeach.DAL" singleton="false" /> <object id="BasicOnClassEntityDal" type="ITOO.BasicTeach.DAL.BasicOnClassEntityDal,ITOO.BasicTeach.DAL" singleton="false" /> <!--D层的的注解--> <!--B层的的注解--> <object id="BasicCourseBll" type="ITOO.BasicTeach.BLL.BasicCourseBll,ITOO.BasicTeach.BLL" singleton="false" /> <object id="BasicCoursepropertyBll" type="ITOO.BasicTeach.BLL.BasicCoursepropertyBll,ITOO.BasicTeach.BLL" singleton="false" /> ... ... ... ... <!--B层的的注解--> </objects> </spring>
1、依赖查找代码,我们在WCF的Service层操作B层,所以应该在Service层查找B层的类
IBasicClassAndOnClassBll IBasicClassAndOnClassBll = SpringHelper.GetObject<IBasicClassAndOnClassBll>("BasicCourseBll");
2、依赖注入代码,我们需要在B层操作D层,所以要通过IOC容器拿到D层的引用,下面是具体的代码
public override void SetDbSession() { //从缓存中取出上下文信息 ICoreDbSession dbSession = CallContext.GetData("DbSession") as ICoreDbSession;//TODO:DbContext,线程内缓存,不适用于集群,后期分布式缓存进行处理,key为guid if (dbSession == null) { //从缓存中拿到这个信息 dbSession =SpringHelper.GetObject<ICoreDbSession>("DBSession");//通过依赖注入找到DBSession CallContext.SetData("DbSession", dbSession); } this.MyBasedbSession = dbSession; this.DbSession = (IDbSession)this.MyBasedbSession; }
三、小结
IOC容器这我也是初步了解,光这一块知识憋了我好几天了,直到今天才算有点进展,之前那个愁啊,WCF这还有很多需要我们研究,比如说通道了,代理了,继续奋斗ing......