zoukankan      html  css  js  c++  java
  • Spring.NET依赖注入框架学习--简单对象注入

    Spring.NET依赖注入框架学习--简单对象注入

    在前面的俩篇中讲解了依赖注入的概念以及Spring.NET框架的核心模块介绍,今天就要看看怎么来使用Spring.NET实现一个简单的对象注入

    常用文件

    我们使用Spring.Net 框架经常要使用到的是以下文件:

    • Common.Logging.dll  包含了Spring.Net日志方面的功能(必须)
    • Spring.Core.dll       包含了Spring.Net 的核心库(必须)
    • Spring.Data.dll       包含了Spring.Net 的数据访问功能
    • Spring.Aop. dll       包含了Spring.Net 对面向切面编程(AOP)的支持
    • Spring.Web.dll       包含了Spring.Net 对ASP.NET进行了一系列功能扩展

    Spring.NET常用接口

     IObjectFactory和IApplicationContext

    IObjectFactory接口提供了一种高级配置机制,可以管理任何类型的对象,提供了配置框架和基本功能。

    IApplicationContext是IObjectFactory的子接口,表示Spring IoC容器,负责在应用程序中实例化,配置和组装许多对象。容器通过读取配置元数据获取对象的实例化,配置和组装。配置元数据以XML表示。它增加了与Spring.NET面向方面编程(AOP)功能,消息资源处理(用于国际化),事件传播和Web应用程序上下文(如Web应用程序上下文)在Web应用程序中使用的更容易的集成,IApplicationContext增加了更多的企业特定功能。 IApplicationContext是IObjectFactory的一个完整的超集。

    Spring.NET提供了几个IApplicationContext接口的实现。在独立的应用程序中,通常在应用程序的App.config文件中以编程方式或声明方式创建XmlApplicationContext的实例。

    在Web应用程序中,Spring提供了一个WebApplicationContext实现,该实现通过在Web.config文件中添加自定义HTTP模块和HTTP处理程序来配置

    下图是Spring.NET的工作原理图

    如上图所示,Spring.NET IoC容器使用一种形式的配置元数据;这个配置元数据表示作为应用程序开发人员如何告诉Spring容器在应用程序中实例化,配置和组装对象。配置元数据以简单直观的XML格式提供

    Spring.Net 的配置介绍

    Spring.Net 的配置文件(一般情况下加入到App.Config或者Web.Config中)内容如下都是XML文件格式

    配置文件中必须要要具有的节点

    spring结点

    spring结点 方式一

    <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>

    spring结点 方式二   

    <spring>
      <context>
        <resource uri="file://objects.xml"/>
        <resource uri="assembly://MyAssembly/MyProject/objects-dal-layer.xml"/>
      </context>
    </spring> 

     <context>节点的type属性是可选的,在Windows应用中,其默认值就是Spring.Context.Support.XmlApplicationContext,所以方式一和方式二完全相同

    spring和context节点的名称不是任意的,必须是"spring"和"context",Spring.NET本身将"spring/context"作为字符串常量定义在了AbstractApplicationContext类中以表示上下文的节点名称所以这个结点名称是不能随便改的,若要引用由以上配置创建的容器,可使用下面的代码:

    IApplicationContext ctx = ContextRegistry.GetContext();

    ContextRegistry类既可用来初始化应用程序上下文,也可用来以服务定位器风格对容器中的对象进行访问,注意,使这一切成为可能的是Spring.Context.Support.ContextHandler类,该类实现了FCL的IConfigurationSectionHandler接口。必须在.NET配置文件的<configSections>节点中注册这个类,注册了这个节点处理器后,配置文件中的<spring>节点才能起作用,如下所示:

    configSections结点

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

    源数据对象xml文件格式

    <objects xmlns="http://www.springframework.net">
      <object id="..." type="...">
        <!-- collaborators and configuration for this object go here -->
      </object>
      <object id="...." type="...">
        <!-- collaborators and configuration for this object go here -->
      </object>
      <!-- more object definitions go here -->
    </objects>

    id属性是用来标识单个对象定义的字符串。 type属性定义对象的类型,并使用完全限定的类型名称,包括程序集名称。

      <object id="对象名称" type="命名空间.类名,程序集名称">
        //对象成员
      </object>

    实例介绍

    Person.cs

    /*****************************************************
     * ProjectName:  Spring.NET01
     * Description:
     * ClassName:    Person
     * CLRVersion:   4.0.30319.42000
     * Author:       JiYF
     * NameSpace:    Spring.NET01
     * MachineName:  JIYF_PC
     * CreateTime:   2018/1/14 11:59:12
     * UpdatedTime:  2018/1/14 11:59:12
    *****************************************************/
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace Spring.NET01
    {
        public class Person
        {
            public Person()
            { }
            ~Person()
            { }
            public void print()
            {
                Console.WriteLine("我是一个Person对象");
            }
        }
    }

    根据配置文件格式我们配置一个Person对象

    App.config文件

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
      <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"></resource>
        </context>
        <objects xmlns="http://www.springframework.net">
          <!--一个person对象-->
          <object id="person1" type="Spring.NET01.Person,Spring.NET01">
            
          </object>
        </objects>
    
      </spring>
    </configuration>

    通过Sprint.NET容器注入对象

    第一步引用Spring.NET动态库文件,这里只需要引用Spring.Core.dll 和Common.Logging.dll动态库文件即可

    代码测试:

        class Program
        {
            static void Main(string[] args)
            {
                //普通对象创建
                Person person = new Person();
                person.print();
    
                //通过Spring.NET ioc注入对象
                IApplicationContext ctx = ContextRegistry.GetContext();
                Person bennanhai = (Person)ctx.GetObject("person1");
                bennanhai.print();
    
                Console.Read();
            }
        }

    执行结果:

    这样一个简单的依赖注入例子就实现了

    源代码工程下载

  • 相关阅读:
    构建自己的外汇智能交易系统
    EA范例
    读书札记:加拿大元因素
    预计欧元近期将“绝境大反攻”
    读书札记:新西兰元因素
    在新的一年里开启新的人生
    旧文重发:行在道上,从局部到全局——与师者高焕堂、赵善中先生谈《大道至简》
    与邹欣先生就《大道至简》一书中的两个主要问题的讨论
    《大道至简》一书第三版,与编辑就本书写作风格的讨论
    与读者们谈谈《大道至简》这五年
  • 原文地址:https://www.cnblogs.com/JiYF/p/8283055.html
Copyright © 2011-2022 走看看