一点一点学架构(三)——Spring.NET IOC

IOC背景介绍

  传统的实现

  • 由程序内部代码来控制类与类之间的关系(如:在一个具体的类中,调用另一个类的方法)。
  • 使用new关键字来实现两个类之间关系的组合。
  • 这种实现方式会造成类之间耦合。

  IOC的实现

  • 它将类间关系从程序内部提到外部容器,也就是说由容器在运行期将类间的某种依赖关系动态注入类中。
  • 对象A依赖于对象B,当对象 A需要用到对象B的时候,IOC容器就会立即创建一个对象B送给对象A。
  • IOC容器就是一个对象制造工厂,你需要什么,它会给你送去,你直接使用就行了,而再也不用去关心你所用的东西是如何制成的,也不用关心最后是怎么被销毁的,这一切全部由IOC容器包办。
                      ——Spring的IOC原理

项目中的应用

  • 在应用程序配置文件中进行配置
    <configSections>
        <sectionGroup name="spring">
            <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
            <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
        </sectionGroup>
    </configSections>
    <spring>
        <context>
            <resource uri="config://spring/objects" />
        </context>
        <objects xmlns="http://www.springframework.net">
            <object id="BidSystemEntities" type="LFBidSystem.Model.BidSystemEntities,LFBidSystem.Model" singleton="false" />
            <!--DbSession层的的注解-->
            <object id="DBSession" type="LFBidSystem.DAL.DbSession,LFBidSystem.DAL" singleton="false">
                <!--加入属性注入,指向D层的注入-->
                <property name="T_BidDAL" ref="T_BidDal"/>          
            </object>

            <!--D层的的注解-->
            <object id="T_BidDal" type="LFBidSystem.DAL.T_BidDal,LFBidSystem.DAL" singleton="false" />
        </objects>
    </spring>
  • 在程序中获取对象
SpringHelper.GetObject<ICoreDbSession>("DBSession");

  SpringHelper是在项目中封装的一个类。
  在上面的配置文件中,展示了创建对象和给对象的属性赋值的方式。
  这里要强调以下内容:


  • 配置内容可以写到应用程序配置文件中(Web.config),也可以写到XML文件中。
  • 在背景中,我们提到IOC容器就相当于是工厂,帮我们产生对象,产生对象的方式有多种,具体可参考以下链接:
    [Spring.NET IoC] 之三:获取对象

  产生对象的方式不同,决定了对象什么时候创建出来,这就是下面我们要介绍的。

执行流程

  这里参考了Java中的SpringIOC的执行流程。


  1. 应用程序开始执行
  2. 创建IOC容器
  3. 解析配置文件
  4. 初始化IOC容器中配置的对象实例

  但是,也有特殊情况,当我们在配置文件中配置对象,并设置为”Singleton=false”时,对象的初始化过程会延迟到我们获取该对象时,即调用GetObject方法时,才实例化。

  这也就是当我们在项目中执行以下这行代码时:

 dbSession = SpringHelper.GetObject<ICoreDbSession>("DBSession");

  程序获取DBSession这个类的实例化对象,会根据配置文件中的属性注入给DBSession中每个属性赋值。而给每个属性赋的值是具体的DAL层中一个类的实例,所以紧接着就会调用每个DAL的构造函数。而每个D层类的构造函数中会调用SetDbContext()这个方法,所以当你的DbSession中有多少个属性,就会执行多少遍的SetDbContext()方法。

public partial class DbSession : IDbSession
    {
        public IT_BidDal T_BidDAL { get; set; }      
    }
}

总结

  IOC作为第三方来维护对象间的依赖关系,解除了对象间的耦合,让我们的项目架构又灵活了些。

你可能感兴趣的:(spring-ioc)