IObjectFactory,IApplicationContext和IObjectDefinition接口介绍
IObjectFactory是初始化、配置及管理对象的实际容器(按:它是所有容器的父接口)。对象间通常会相互协作,我们也可以说它们相互间具有依赖性。这些依赖性可以通过IObjectFactory的配置数据反映出来。Spring.Objects.Factory.IObjectFactory接口有多个实现类。最常用的是Spring.Objects.Factory.Xml.XmlObjectFactory。Spring.NET框架的核心原则是非侵入性。简单的说,就是应用程序的代码不需要对Spring.NET的API有任何依赖。然而,如果要充分利用 IoC容器的功能(通过IObjectFactory或Spring.Context.IApplicationContext接口),有时候还 必须要 获取这两个接口的引用。为此,可以在代码中使用new操作符来显式创建容器(按:即原文所说的IApplicationContext或 IObjectFactory,后文中,举凡涉及到含义为“管理对象的容器”而非特指接口的名称时,将原文中的IObjectFactory或 IApplicationContext称为“容器”或“IoC容器”);另外一种方式则更为简捷:在.NET应用程序的配置文件中用自定义配置节点来配 置容器。一旦容器建立,就不需要在代码中与之发生显式的互操作了(按:这个说法并不准确,比如对象的获取就必须通过 IApplicationContext,此处的含义指不需要进行任何与对象创建和管理相关的工作)。
下面分别是获取IObjectFactory,IApplictationContext的代码:
[C#]
IResource input = new FileSystemResource ("objects.xml");//IResource能以简单统一的方式访问许多可用System.IO.Stream表示的IO资源。
IObjectFactory factory = new XmlObjectFactory(input);
IApplicationContext context = new XmlApplicationContext(
"file://objects.xml",
"assembly://MyAssembly/MyProject/objects-dal-layer.xml");
//引用.NET程序集内嵌资源时的URI语法:assembly://<AssemblyName>/<NameSpace>/<ResourceName>
//要在VS中创建一个内嵌的资源,必须在文件属性编辑器中将xml配置文件的Build Action(生成操作)设为Embedded Resource(嵌入的资源)。
第一个Spring.NET的程序
n 建立项目
项目名称为:SpringSample,NameSpace为“OKEC.Sample.Spring”。
n 添加HelloTest类
HelloTest.cs
using System; namespace OKEC.Sample.Spring { /// <summary> /// HelloTest 的摘要说明。 /// </summary> public class HelloTest { public HelloTest() { // // TODO: 在此处添加构造函数逻辑 // } public void Test() { Console.WriteLine("This is Spring.NET Sample Test!"); Console.WriteLine("Please press Enter close the windows!"); Console.ReadLine();//让程序停留,回车关闭。 } } } |
n 添加Spring.NET的配置文件
文件名:Spring_bean.xml,属性(生成操作)设置为:嵌入的资源/ Embedded Resource
<?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="Hello" type="OKEC.Sample.Spring.HelloTest,SpringSample" /> </objects> |
n 建立Spring.NET的容器初始化对像
SpringContext.cs
using System; using Spring.Core; using Spring.Aop; using System; using Spring.Core; using Spring.Aop; using Spring.Context; using Spring.Context.Support; namespace OKEC.Sample.Spring { /// <summary> /// SpringFactory 的摘要说明。 /// </summary> public class SpringContext { public SpringContext() { // // TODO: 在此处添加构造函数逻辑 // } private static bool isInit = false; private static IApplicationContext context; public static void init() { string[] xmlFiles = new string[1]; xmlFiles[0] = "assembly://SpringSample/OKEC.Sample.Spring/Spring_bean.xml"; context = new XmlApplicationContext(xmlFiles); isInit = true; } public static IApplicationContext Context { get{ if(!isInit) { init(); } return context; } } } } |
n 添加启动程序
StartMain.cs
using System; namespace OKEC.Sample.Spring { /// <summary> /// StartMain 的摘要说明。 /// </summary> public class StartMain { public StartMain() { // // TODO: 在此处添加构造函数逻辑 // } [STAThread] static void Main() { //Startup Spring Content SpringContext.init();
//Test Spring IOC HelloTest test = (HelloTest)SpringContext.Context.GetObject("Hello"); test.Test(); } } } |
n 运行程序
结果为:
This is Spring.NET Sample Test! Please press Enter close the windows! |
你的第一个Spring.NET的程序成功了!
以上案例是从网上粘贴过来的, IApplicationContext是在程序中实例化的,下面做点修改,用多个配置文件创建容器(此处的配置文件是指包括了Spring.NET对象定义的XML文件,而非特指.config文件)创建方式是在标准.NET应用程序配置文件中(App.config或Web.config)添加自定义配置节点
App.config:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="spring">
<section name="context"
type="Spring.Context.Support.ContextHandler, Spring.Core"/>
</sectionGroup>
</configSections>
<spring>
<context type="Spring.Context.Support.XmlApplicationContext, Spring.Core">>
<resource uri="assembly://SpringSample/OKEC.Sample.Spring/Spring_bean.xml"/>
</context>
</spring>
</configuration>
//注意配置中的<sectionGroup>节点,此处注册了一个类型为 Spring.Context.Support.ContextHandler的节点处理器,用来处理配置文件中的<context>节点, 该类实现了FCL中的IConfigurationSectionHandler接口。必须在.NET配置文件的< configSections>节点中注册这个类,否则Spring.NET无法自动处理应用程序上下文的配置信息,也无法使用 ContextRegistry对容器进行访问。
SpringContext中的
string[] xmlFiles = new string[1];
xmlFiles[0] = "assembly://SpringSample/OKEC.Sample.Spring/Spring_bean.xml";
context = new XmlApplicationContext(xmlFiles);
更改为: context = ContextRegistry.GetContext();