Spring.NET学习实践(1)---Spring.NET的构架
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());
}
}
}