初识IOC容器

    我们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;
        }

    上面这个依赖注入代码是在B层的BaseService中写的,BaseService继承与CoreBaseService,CoreBaseService这里面有两个方法,一个是SetDBSession() 一个是SetCurrentDal() ,第一个方法好比拿到一个大箱子,这个大箱子中放着D层的引用,第二个方法好比拿到一个D层类具体的引用。这样我们就可以操作D层了。

    三、小结
    IOC容器这我也是初步了解,光这一块知识憋了我好几天了,直到今天才算有点进展,之前那个愁啊,WCF这还有很多需要我们研究,比如说通道了,代理了,继续奋斗ing......

你可能感兴趣的:(初识IOC容器)