参考文章:http://www.cnblogs.com/GoodHelper/archive/2009/10/25/SpringNET_Config.html
一、环境下载及安装
到Spring的官方网站下载Spring.NET框架的安装文件(Spring.NET-1.3.0-RC1.exe)。目前Spring.NET最新的版本是1.3。下载并解压后就可以了。Spring.NET框架经常用到的一下几个文件:
- Common.Logging.dll(必要)
- Spring.Core.dll(必要)
- Spring.Data.dll
- Spring.Aop.dll(可选)
- Spring.Data.NHibernate21.dll
- Spring.Web.dll
在基于XML的工厂中,这些对象定义表现为一个或多个<object>子节点,它们的父节点必须是<objects>(按:objects节点的xmlns元素是必需的,必须根据不同的应用添加不同的命名空间,以便有IDE的智能提示。
<objects xmlns="http://www.springframework.net"> <object id="BLL" type="CloudLink.BLL.BLLFactory,CloudLink.BLL"></object> <object id="DAL" type="CloudLink.DAL.DALFactory,CloudLink.DAL"></object> </objects>
二、实例化spring.net容器的方式
1、实际物理地址
首先需要新建一个Object.xml文件,然后从Spring.net手册中复制配置模板:
<?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 id="ProductDAO" type="DAO.ProductDAO, DAO"> </object> </objects>
修改这个文件的生成方式为“嵌入的资源”。注意一定要修改,不然容器初始化时就会抛异常。然后通过如下代码来获取这个配置文件:
IResource input = new FileSystemResource(@"D:Objects.xml"); //实际物理路径 IObjectFactory factory = new XmlObjectFactory(input);
2、程序集下寻找配置文件
这种方式需满足URI语法。file://文件名 assembly://程序集名/命名空名/文件名
string[] xmlFiles = new string[] { "file://Objects.xml" }; IApplicationContext context = new XmlApplicationContext(xmlFiles); IObjectFactory factory = (IObjectFactory)context; Console.ReadLine();
然后在应用程序配置文件添加如下配置:
<?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="assembly://IocDemo/IocDemo/Objects.xml"/>//就是这句 <resource uri="config://spring/objects" /> </context> <objects xmlns="http://www.springframework.net"> <description>一个简单的控制反转例子</description> <object id="ProductDAO" type="DAO.ProductDAO, DAO"> <constructor-arg name="accessor" value="1"/> </object> </objects> </spring> </configuration>
3、直接在应用程序配置文件中添加spring节点
<?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" /> </context> <objects xmlns="http://www.springframework.net">//就是这一堆 <description>一个简单的控制反转例子</description> <object id="ProductDAO" type="DAO.ProductDAO, DAO"> <constructor-arg name="accessor" value="1"/> </object> </objects> </spring> </configuration>
其中的<constructor-arg name="accessor" value="1"/>,表示ProductDAO的构造函数有一个名称accessor的参数,默认值为1。如果类有属性,那么需要添加<property name="属性名" value="默认值"/>。
如果构造函数的参数为引用类型的,那么需要将引用类型也加上。详见:http://www.cnblogs.com/supheart/p/4317574.html。
三、普通调用方式、抽象工厂模式与IOC模式对比
1、数据访问层
public interface IProductDAO { /// <summary> /// 获取产品名称 /// </summary> /// <returns></returns> string GetProductName(); } public class ProductDAO : IProductDAO { private string _accessor; public ProductDAO(string accessor) { this._accessor = accessor; } /// <summary> /// 获取产品名称 /// </summary> /// <returns></returns> public string GetProductName() { return "Hello, " + this._accessor + "! The product name is IPhone 7!"; } }
2、抽象工厂类
public static class DataAccess { public static IProductDAO CreateProductDAO(string accessor) { return new ProductDAO(accessor); } }
3、三种方式
static void Main(string[] args) { //一般方法 NormalMethod(); //抽象工厂模式 FactoryMethod(); //IOC方式 IocMethod(); Console.Read(); } private static void NormalMethod() { IProductDAO dao = new ProductDAO("NormalMethod"); Console.WriteLine(dao.GetProductName()); } private static void FactoryMethod() { IProductDAO dao = DataAccess.CreateProductDAO("FactoryMethod"); Console.WriteLine(dao.GetProductName()); } private static void IocMethod() { IApplicationContext context = ContextRegistry.GetContext(); IProductDAO dao = context.GetObject("ProductDAO", new[] { "IocMethod" }) as IProductDAO; Console.WriteLine(dao.GetProductName()); }
运行结果:
本文示例代码:http://files.cnblogs.com/files/wangwust/IocDemo.zip