您的位置:首页 > 编程语言 > Java开发

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

2015-07-28 22:07 225 查看

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的执行流程。



应用程序开始执行

创建IOC容器

解析配置文件

初始化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作为第三方来维护对象间的依赖关系,解除了对象间的耦合,让我们的项目架构又灵活了些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: