018. Spring.Net简单入门之一概念和基本操作

所需资源(Spring.NET.2.0.0-M2)下载地址: 百度网盘

Ioc和DI

Ioc: Inversion of Control 控制反转:

  正常情况下, 在程序中创建实例, 是由程序本身来控制的, 那么控制反转概念就是说, 如果程序中需要使用实例, 将不再由程序本身来创建实例, 而是交由外部的容器来创建; 也就是说将创建实例的控制权, 反转到外面来; 其实这个容器可以理解为一个工厂; 当然要不工厂所做的事多的多;

DI: Dependency Injection (依赖注入): Ioc和DI是必须要结合在一起来理解的, 外部容器在创建实例的时候, 可以通过一个配置文件(xml文件)给创建的对象设置一些默认值(属性/构造函数), 即通过此配置文件将这些默认的数据注入到刚刚创建好的实例中去. 然后再把这个对象返回; 使用者拿到这个实例的时候, 实例就肯定有一些默认值了; 这就是依赖注入; 其实严格上来说Ioc和DI结合才能算得上是依赖注入, 单独的拆开来说没有意义

简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,这就是反转; IOC的基本概念: 不创建对象, 但是描述创建他们的方式. 在代码中不直接与对象和服务连接, 但在配置文件后只能怪描述哪一个组件需要哪一项服务. 容器负责将这些联系在一起

而Spring.net只不过是实现了依赖注入这种思想的一个框架, 在Sprign.Net中一般使用IApplicationContext作为容器

简单使用:

1. 在VS中新建一个控制台项目Spring.NetDemo, 在项目中创建一个接口IUserInfoDal, 接口中定义一个Show方法, 创建一个类UserInfoDal实现IUserInfoDal接口

2. 复制前面下载的Spring.Net中examples中任意示例文件的app.config中内容, 到当前Demo项目的App.config文件中

比如复制: Spring.NET\examples\Spring\Spring.AopQuickStart\src\Spring.AopQuickStart.Step7这个目录下的app.config文件

删除一些注释之后, 总体应该如下:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
    <configSections>
      <sectionGroup name="spring"> <!--这句话的意思就是在该配置文件中的<configuration>节点下, 添加一个节点, 节点的名字就是spring, 这个可以在下面看的到-->
        <!--而这个spring节点, 下面应该包含两个子节点, 第一个子节点的名字是context,其中context节点中的内容由Spring.Context.Support.ContextHandler来解析
        第二个子节点的名字是objects, 其中objects节点下的内容由Spring.Context.Support.DefaultSectionHandler解析-->
        <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/>
        <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core"/>
      </sectionGroup>
    </configSections>

    <spring>
      <!--spring.net对象容器的配置-->
      <context>
        <!--容器里面所有的对象在哪里配置?就是在这个uri所指定的路径中配置, 这里的意思就是在: 当前配置文件所在的目录中的spring节点下面的objects中配置着-->
        <resource uri="config://spring/objects"/>
      </context>
      <objects xmlns="http://www.springframework.net">
        <description>An example that demonstrates use of AutoProxy functionality.</description><!--这是一个描述, 无意义-->
<!--配置一个对象, name一般是一个类名, type分成两块, 第一部分: 类的全路径名称, 第二部分表示该类所在的程序集-->
        <object id="UserInfoDal" name="UserInfoDal" type="Spring.NetDemo.UserInfoDal, Spring.NetDemo"/>
        <!--前台的所有配置都不用改变, 以后只需要改变一个配置, 注入的实例就会发生变化-->
      </objects>
    </spring>
</configuration>

 

 3. 添加引用, 一般会将Spring.Net中的bin目录下的dll文件,拷贝到项目中的packages目录下, 新建一个文件夹Spring.Net, 然后再添加引用, 其中位于Spring.NET\bin\net\4.0\release下的Common.Logging.dll和Spring.Core.dll是必须要拷贝的

4. Program.cs代码

using Spring.Context;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Spring.NetDemo
{
   public  class Program
    {
       public static void Main(string[] args)
        {
            //在没有使用Spring之前, 一直使用的传统的写法
            //IUserInfoDal userInfoDal = new UserInfo();
            //userInfoDal.Show();

            //使用容器来创建一个UserInfoDal实例
            IApplicationContext ctx =  Spring.Context.Support.ContextRegistry.GetContext();

            IUserInfoDal userInfoDal = ctx.GetObject("UserInfoDal") as IUserInfoDal;
            userInfoDal.Show();

            Console.ReadKey();

        }
    }
}

 5. 把objects配置到文件中

右键→项目→添加xml文件→Dals.xml→然后在app.config中的<spring><context>节点下输入:<resource uri="file://Dals.xml" />

<spring>
      <!--spring.net对象容器的配置-->
      <context>
        <!--容器里面所有的对象在哪里配置?就是在这个uri所指定的路径中配置, 这里的意思就是在: 当前配置文件所在的目录中的spring节点下面的objects中配置着-->
        <resource uri="config://spring/objects"/>
        <resource uri="file://Dals.xml" />
      </context>
      <objects xmlns="http://www.springframework.net">
        <description>An example that demonstrates use of AutoProxy functionality.</description><!--这是一个描述, 无意义-->
<!--配置一个对象, name一般是一个类名, type分成两块, 第一部分: 类的全路径名称, 第二部分表示该类所在的程序集-->
        <object id="UserInfoDal" name="UserInfoDal" type="Spring.NetDemo.UserInfoDal, Spring.NetDemo"/>
        <!--前台的所有配置都不用改变, 以后只需要改变一个配置, 注入的实例就会发生变化-->
      </objects>
    </spring>

 6. Dals.xml文件内容如下, 然后右键此文件, 将其编译时复制到运行目录下(下图):

<?xml version="1.0" encoding="utf-8" ?>
<objects xmlns="http://www.springframework.net" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://www.springframework.net
         http://www.springframework.net/xsd/spring-objects.xsd"> 

  <object name ="UserInfoDal1" type="SpringNetDemo.UserInfoDal, SpringNetDemo">
    
  </object>
</objects>

 

7. 当然也可以使用程序集的方式,具体xml代码如下:

   <spring>
      <!--spring.net对象容器的配置-->
      <context>
        <!--容器里面所有的对象在哪里配置?就是在这个uri所指定的路径中配置, 这里的意思就是在: 当前配置文件所在的目录中的spring节点下面的objects中配置着-->
        <resource uri="config://spring/objects"/>
        <!--<resource uri="file://Dals.xml" />-->
        <resource uri="assembly://Spring.NetDemo/Spring.NetDemo/Dals.xml"></resource>
      </context>
      <objects xmlns="http://www.springframework.net">
        <description>An example that demonstrates use of AutoProxy functionality.</description><!--这是一个描述, 无意义-->
<!--配置一个对象, name一般是一个类名, type分成两块, 第一部分: 类的全路径名称, 第二部分表示该类所在的程序集-->
        <object id="UserInfoDal" name="UserInfoDal" type="Spring.NetDemo.UserInfoDal, Spring.NetDemo"/>
        <!--前台的所有配置都不用改变, 以后只需要改变一个配置, 注入的实例就会发生变化-->
      </objects>
    </spring>

 错误处理:

1. 关于 未处理ApplicationContextException的异常

报错信息:

其他信息: No context registered. Use the 'RegisterContext' method or the 'spring/context' section from your configuration file.

截图:

解决:

a. 检查app.config文件的配置的正确性

b. 检查是否将App.config文件复制到debug目录下, 如果有将其删除

 2. 未能找到context元素的架构信息:

这其实不算个错误, 严格来说连个异常都算不上, 只能算是一个消息吧, 不影响编译和运行, 在web.config编辑界面中,菜单栏里会有一项XML,打开其中架构…项,会有很多VS预定义的.xsd文件,其中就包括config文件的定义信息. Spring中所有节点都不在xsd的定义中,所以VS会报一个消息, 所有的自定义配置项或者外部的xml文件都会有这个现象.

 

posted on 2017-02-26 14:09  印子  阅读(305)  评论(0)    收藏  举报

导航