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文件都会有这个现象.
浙公网安备 33010602011771号