• Spring.Net的Ioc功能基本配置


    Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。

    Spring.NET框架包括很多功能,这些功能被很好的组织进一系列模块当中,Spring.Core作为整个框架的基础,实现了依赖注入的功能。Spring.NET的大部分模块都要依赖或扩展该模块。Spring.Core程序集中的IObjectFactory接口为Spring.NET提供了一种高级的配置机制,可用所有可能的存储介质保存任意对象的配置信息。同位于此程序内的IApplicationContext接口则扩展了IObjectFactory,增加了面向方面编程(AOP)和消息资源处理(用于国际化)等功能。简单的说,IObjectFactory接口提供了配置框架和基本功能,IApplicationContext接口又在其基础上扩展了许多企业级特性。可以说IApplicationContext是IObjectFactory的一个超集,具备IObjectFactory所有的功能与行为。

    (一)容器的定义
    Spring.NET框架的核心原则是非侵入性。简单的说,就是应用程序的代码不需要对Spring.NET的API有任何依赖。然而,如果要通过IObjectFactory或IApplicationContext接口充分利用IoC容器的功能,有时候还必须要初始化这两个接口的某个实现类。为此,可以在代码中使用new操作符来显式创建容器(举凡涉及到含义为“管理对象的容器”而非特指接口的名称时,将原文中的IObjectFactory或IApplicationContext称为“容器”或“IoC容器”);另一种更为简单的方式是在.NET应用程序的标准配置文件中用一个自定义节点来配置容器。一旦容器建立,应用程序代码就可能不再需要与之发生显式的交互了。

    (1)在代码中创建容器

    /初始化IObjectFactory 
    IResource input = new FileSystemResource ("objects.xml");
    IObjectFactory factory = new XmlObjectFactory(input);
    
    //初始化IApplicationContext 
    IApplicationContext context = new XmlApplicationContext("file://objects.xml", "assembly://MyAssembly/MyProject/objects-dal-layer.xml");
    IObjectFactory factory = (IObjectFactory) context;

    (2)在配置文件中创建容器
    更好的创建方式是在标准.NET应用程序配置文件中(App.config或Web.config)添加自定义配置节点。以下的XML节点可以创建与前例相同的容器:

    <spring>
    <context type="Spring.Context.Support.XmlApplicationContext, Spring.Core">
    <resource uri="file://objects.xml"/>
    <resource uri="assembly://MyAssembly/MyProject/objects-dal-layer.xml"/>
    </context>
    </spring>

    然后再代码中通过下面代码后去容器:

    IApplicationContext ctx = ContextRegistry.GetContext();

    ContextRegistry类既可用来初始化应用程序上下文。而在内部实现的是Spring.Context.Support.ContextHandler类,该类实现了FCL的IConfigurationSectionHandler接口。必须在.NET配置文件的<configSections>节点中注册这个类,如下所示:

    <configSections>
    <sectionGroup name="spring">
    <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
    </sectionGroup>
    </configSections> 

    注册了这个节点处理器后,配置文件中的<spring>节点才能起作用。

    (二)对象定义
    要定义对象,同样要在XML文件(objects.xml)或配置文件中定义object节点,当定义了节点后,Ioc容器就会在初始化时创建要定义的对象,该配置是在spring/objects的节点下,

    <spring>
    <objects>
    <object id="exampleObject" type="Examples.ExampleObject, ExamplesLibrary"/>
    </objects>
    </spring>

    同样,要注册节点处理器,

    <configSections>
    <sectionGroup name="spring">
    <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
    </sectionGroup>
    </configSections>

    (1)根据类型定义对象
    在定义的object节点中,指明对象类型(以及它所在的程序集名称)就可以定义对象了。不过,根据不同IoC容器的要求,可能需要为类型定义默认构造器(即无参的构造器)。

    <object id="exampleObject" type="Examples.ExampleObject, ExamplesLibrary"/>

    这个节点定义了一个名为exampleObject的对象,它的类型是位于ExamplesLibrary程序集中的Examples.ExampleObject类。请特别留心一下type属性的格式:类型的全名,然后是一个逗号,最后是类型所在的程序集名称。在上面的例子中,ExampleObject类定义在Examples命名空间,且位于ExamplesLibrary程序集中。

    type属性值必须包含类型所在的程序集名称。如果需要为嵌套类型创建对象,可以使用+号。例如,如果在类型Examples.ExampleObject嵌套定义了类型Person,就可以用下面的方式创建对象定义:

    <object id="exampleObject" type="Examples.ExampleObject+Person, ExamplesLibrary"/>

    如果应用程序能够以标准的程序集探测机制访问程序集(例如ASP.NET中的bin文件夹),那么type属性的值只需包括类型全名即可。这样,当程序集改变后,不需要去修改每个对象定义的type属性(主要是改些版本号等等),Spring.NET就会自动使用最新的程序集。

    (2)通过静态工厂方法创建对象
    在使用静态工厂方法创建对象时,除了要将对象定义的type属性设为包含静态工厂方法的类型外,还要设置一个名为factory-method的属性来指定静态工厂方法的名称。Spring.NET会调用这个方法来创建对象,结果和通过构造器创建对象是一样的。在实际项目中,可以用这种方法去调用原有代码中的静态工厂。

    下面的对象就是通过静态工厂方法创建的。注意:对象定义中的type并非是要创建的对象的类型,而是包含了工厂方法的类型;同时,CreateInstance必须是静态方法。

    <object id="exampleObject" type="Examples.ExampleObjectFactory, ExamplesLibrary" factory-method="CreateInstance"/>

    (3)对象创建时注入构造参数
    有些显示构造函数是需要参数的,为了给这些构造函数参数赋上值,在object节点是需要添加子节点的值,具体如下:

    <object id="exampleObject" type="Examples.ExampleObject, ExamplesLibrary">
    <constructor-arg name="IntegerProperty" value="1"/>
    </object>

    (4)对象创建时注入属性值
    为了在对象创建时为对象的属性赋值,同样需要在object节点下添加子节点

    <object id="exampleObject" type="Examples.ExampleObject, ExamplesLibrary">
    <property name="IntegerProperty" value="1"/>
    </object>

    以上的参数和属性的注入是针对值类型的,构造参数或属性中有些类型是有引用类型的,此时需要将节点的value改为ref,同时要在object节点中注册该引用类型:

    <object id="exampleObject" type="Examples.ExampleObject, ExamplesLibrary">
    <property name="objectOne" ref="anotherExampleObject"/>
    <property name="objectTwo" ref="yetAnotherObject"/>
    <property name="IntegerProperty" value="1"/>
    </object>
    
    <object id="anotherExampleObject" type="Examples.AnotherObject, ExamplesLibrary"/>
    
    <object id="yetAnotherObject" type="Examples.YetAnotherObject, ExamplesLibrary"/>

    (三)代码获取对象
    (1)直接不经过文件注册获取对象

    StaticApplicationContext context = new StaticApplicationContext();
    context.RegisterPrototype("exampleObject", typeof(ExampleObject), null);
    ExampleObject exampleObject = context.GetObject("exampleObject") as ExampleObject;

    (2)根据特定的Xml文件(objects.xml)获取对象

    XmlApplicationContext context = new XmlApplicationContext("objects.xml");
    ExampleObject exampleObject = context.GetObject("exampleObject") as ExampleObject;

    (3)根据配置文件(App.config或web.config)获取对象

    IApplicationContext context = ContextRegistry.GetContext();
    ExampleObject exampleObject = context.GetObject("exampleObject") as ExampleObject;

     

     

  • 相关阅读:
    硕士时代的数学知识点小节
    电子科技大学 易查分网站 爬虫 批量爬取成绩
    使用SKlearn(Sci-Kit Learn)进行SVR模型学习
    使用经验风险最小化ERM方法来估计模型误差 开坑
    二分图最大匹配模版 m√(n) 复杂度
    支持向量机SVM 初识
    K-means + PCA + T-SNE 实现高维数据的聚类与可视化
    Bin Packing 装箱问题——NPH问题的暴力枚举 状压DP
    CDQ分治_占坑
    Logistic回归 逻辑回归 练习——以2018建模校赛为数据源
  • 原文地址:https://www.cnblogs.com/supheart/p/4317574.html
Copyright © 2020-2023  润新知