Spring.NET
学习实践(
1
)
Spring.NET的构架:
从
2004-08-04
的第一版本算起,
Spring.NET
出来已经很久了。但是相比较他的姐姐
Spring
,虽然借助于
.NET
强大的反射机制,甚至拥有比原
Java
版本更强大的功能。但是不得不承认,相对于
JAVA
社区的人山人海,
Spring.NET
的人气
还
真的是不旺。
在这篇笔记中,我会谈及一些概念和术语,如果你对
IOC,DI, AutoWiring
等概念不太熟悉的话,请在阅读本篇之前详细阅读圈内公认的几篇理论文章。找到他们很简单,放狗
(Google)
就可以了。
言归正传,让我们首先看一副经典的图把。

这
是
截至到
2006-11-7hao
为止的
Spring .NET
构架图,展现出了
Spring .NET
的各个模块。具有阴影的模块包含在
1.0
版本中,其他模块则被许诺在将来的发布中推出。
从这幅图,我们可以看出
Spring .NET
和其老姐
Spring
的核心构架是完全一致的,
Spring.Core
库是框架的基础
,
提供依赖注入功能。
Spring.Aop
库提供对业务对象的面向方面编程
(AOP)
的支持。
Spring.Aop
库是对
Spring.Core
库的补充,可为声明性地建立企业应用和为业务对象提供服务提供坚实的基础。
Spring.Web 库扩展了 ASP.NET ,添加了一些功能,如对 ASP.NET 页面的依赖注入,双向数据绑定,针对 ASP.NET 1.1 的 Master pages( 没明白这时在指什么 ) 以及改进的本地化支持。
Spring.Web 库扩展了 ASP.NET ,添加了一些功能,如对 ASP.NET 页面的依赖注入,双向数据绑定,针对 ASP.NET 1.1 的 Master pages( 没明白这时在指什么 ) 以及改进的本地化支持。
Spring.Services
库可让你将任何
“
一般
”
对象
(
即没有从其他特殊的服务基类继承的对象
)
暴露为企业服务(
Com+
)或远程对象
(remoting object.)
,使得
.NET Web services
获得依赖注入的支持,并覆盖属性元数据。此外还提供了对
Windows Service
的集成。
Spring.Data 库提供了数据访问层的抽象,可以被多个数据访问提供者(从 ADO.NET 到多个 ORM 提供者)应用。它还包含一个对 ADO.NET 的抽象层,移除了为 ADO.NET 编写可怕的编码和声明性的事务管理的必要。
Spring.Data 库提供了数据访问层的抽象,可以被多个数据访问提供者(从 ADO.NET 到多个 ORM 提供者)应用。它还包含一个对 ADO.NET 的抽象层,移除了为 ADO.NET 编写可怕的编码和声明性的事务管理的必要。
Spring.ROM
将提供常用的
’
对象
/
关系
’
映射集成,支持
iBatis.NET, Nhibernate.
并且提供了一些功能,比如对声明性事务管理的支持。
Spring.Core
库如同
JAVA
上的
Core
封装包,提供了三个接口来实现依赖注入。
IObjectFactory
是
Spring
的核心容器接口
,
负责管理容器内的注入对象。他提供了一个简单而优雅的工厂模式,移除了对单例和一些服务定位
stub
写程序的必要。
允许你将真正的程序逻辑的配置和依赖的详细情况解耦。
作为对
IObjectFactory
的继承,
IApplicationContext
接口也在
Spring.Core
库中,并且添加了许多企业应用为中心的功能,例如利用资源文件进行国际化、事件传播、资源加载等。
由于
IApplicationContext
包括了
IObjectFactory
所有的功能,所以通常建议优先采用
IApplicationContext
。除了一些受限的场合比如在一个模块中,这时内存的消耗可能很关键,过多的内存占用可能导致反应速度下降。这时我们可以使用
IObjectFactory
。
ObjectDefinition
是注入对象的定义接口,供
IObjectFactory / IApplicationContext
调用。
相信使用过
Spring
的朋友可以马上熟悉以上三个兄弟,实际上
IObjectFactory
,
IApplicationContext
可以完全被看作是
BeanFactory, ApplicationContext
的
.net
翻版。
按照传统,用一
个
HelloWorld
来结束把
。
using
System;
using
System.Text;
using
Spring.Core;
using
Spring.Context;
using
Spring.Context.Support;
namespace
TestSpringNetTestHelloWorld
{
public interface SayHi
{
string SayHello();
}
public class HelloWorld : SayHi
{
public string SayHello()
{
return "Hello, World!";
}
}
public class Program
{
static void Main(string[] args)
{
StaticApplicationContext context = new StaticApplicationContext();
context.RegisterPrototype("HelloWorld", typeof(HelloWorld), null);
SayHi o = context.GetObject("HelloWorld") as SayHi;
System.Windows.Forms.MessageBox.Show(o.SayHello());
}
}
}