Spring.NET学习笔记——前言
Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为基础,将Spring.Java的核心概念与思想移植到了.NET平台上。
企业级应用一般由多个物理层组成,每个物理层也经常划分为若干功能层。不同层次之间需要相互协作,例如,业务服务层一般需要使用数据访问层的对象来实现某个用例。不管应用程序如何构建,最终都会表现为一系列相互协作的对象,这些对象一起组成了完整的应用程序。所以我们说,应用程序中的对象之间相互具有依赖性。
.NET平台为构建应用程序提供了丰富的功能,从非常基础的基元类型和基础类库(以及定义新类的方法),到功能完善的应用程序服务器和Web框架,都有很好的支持。但.NET平台本身并没有提供任何方式来管理基础的应用模块并将它们组合为一个相互协作的整体,只能依靠架构师或开发人员去创建(一系列)应用程序。诚然,目前有很多设计模式可用于业务系统的设计,我们可以使用这些模式将各种类或对象组合成能够正常工作的完整应用。工厂、抽象工厂、Builder、装饰及服务定位器(Service Locator)等模式已被现今的软件开发行业广泛接受和采用(这也许正是这些模式最早被定型为模式的原因)。这些模式都非常好,但也不过是些已命名的最佳编程方法,在对这些模式的介绍中一般还会说明它们是作什么用的、最好应用到什么场合、可以解决什么问题等等。我们可以从许多书籍和wiki上找到这些模式,然后仔细研读,然后实现在我们自己的应用中。
Spring.NET的IoC容器所解决的,正是如何在企业应用中将类、对象和服务组合成应用程序的问题。IoC容器通过很正统(按:formalized,言下之意是这些方式都是已经定型了的、经过了业界多年考验的)的方式将分散的组件组合成完整的应用程序。Spring.NET框架所采用的,都是被业界无数应用程序考验多年的、已经被定型为设计模式的最佳编程方式,实际上,这些模式已经成为我们架构和开发时的法典,而通过Spring.NET,我们可以直接将它们整合到自己的应用程序中。目前已有很多组织和机构用Spring框架开发出了强壮的、维护性好的应用程序,这确实是一件非常好的事情。
在2004年初,Martin Fowler曾经问他网站的读者:当我们谈到控制反转时,“问题是,它们反转的是哪方面的控制?”。随后Fowler建议为控制反转重新命名(或者起码给它一个更具自我描述性的名字),所以依赖注入(Dependency Injection)这一术语才得以使用。Fowler在论文中也讨论了控制反转和依赖注入原理背后的一些概念。如果您需要了解正宗的IoC和DI理论,可以参考这篇论文:http://martinfowler.com/articles/injection.html。
Spring.NET框架包含了许多功能方面,它们都进入如下图所示的模块组织。下图显示了Spring.NET各核心模块。
Spring.Core作为整个框架的基础,实现了依赖注入的功能。Spring.NET的大部分模块都要依赖或扩展该模块。Spring.Core的基础是IObjectFactory接口,该接口用一个简单而优雅的方式实现了工厂模式,使我们可以无需自行编写singleton类型和众多的服务定位器,并允许将对象配置及其依赖关系与具体的程序逻辑解耦。该模块中的IApplicationContext接口是IObjectFactory的扩展,增加了诸多企业级功能,包括使用资源文件进行文本本地化、事件传播和资源装载等等。
Spring.AOP为业务对象提供面向方面编程(AOP)的支持。AOP完善了IoC容器的功能,为创建企业应用和使用声明式服务奠定了坚实的基础。
Spring.Data定义了一个抽象的数据访问层,可以跨越各种数据访问技术(从ADO.NET到各种ORM)进行数据访问。该模块包含一个ADO.NET的抽象层,减少了使用传统ADO.NET进行编码和事务管理时的工作量。
Spring.Data.NHibernate使用此模块集成到Spring的声明式事务管理功能NHibernate的能容易地操作ADO.NET和NHibernate的混合在同一事务。 NHibernate的1.0用户将受益于易于使用的API来执行数据访问操作。
Spring.Web使用此模块,以抽象方式编写ASP.NET Web应用程序时允许你有效地解决共同的棘手问题,如在ASP.NET数据绑定,验证和ASP.NET母板页、控件、模块、驱动配置。
Spring.Web.Extensions 使用此模块,可以轻松公开一个平原。NET对象(PONO),这是一个没有任何属性或特殊基类作为Web Service,通过依赖注入配置,应用AOP,并暴露在客户端的JavaScript。
Spring.Services - 使用此模块,以适应平原。使他们能够与特定的分布式通信技术等。NET Remoting的,企业服务,ASMX Web Service,和WCF服务,使用NET对象。这些服务可以通过依赖注入配置和应用AOP。
Spring.Testing.NUnit - 使用此模块进行整合NUnit的测试。
Spring.Testing.Microsoft - 使用此模块进行集成测试框架与微软(MSTest的)测试。
Spring.Messaging - 使用此模块,以提您高效的创建Microsoft消息队列(MSMQ)应用程序坚实基础的最佳做法。
Spring.Messaging.Nms - 使用此模块,以提您高效的创建Apache ActiveMQ的应用程序,坚实基础的最佳做法。
Spring.Messaging.Ems - 使用此模块,以提您高效的创建TIBCO公司环境管理体系的应用程序坚实基础的最佳做法。
Spring.Scheduling.Quartz - 提供与Quartz.NET工作提供Quartz jobs,调度声明配置调度一体化,触发器以及一些方便的类以提高生产率在建立工作调度应用。
Spring.Template.Velocity - 辅助类配置NVelocity模板引擎在Spring.NET的应用程序。
《Spring.NET学习笔记》系列博客主要是我本人对Spring.NET一个学习巩固的过程。该过程分为五个阶段:控制反转与依赖注入、面向切面编程、集成NHibernate与ASP.NET MVC开发、面向服务编程、扩展集成。而在最我又补充了一个项目的实战应用“企业架构体系实战”,我想这样对全面了解Spring.NET有所帮助。
我个人认为,Spring.NET是目前最强大的IoC&AOP框架之一,到目前为止,在.NET中很少有其它框架能与Spring.NET一较高下,而Spring.NET框架的功能覆盖面很广,适合大型企业、网站的项目开发及应用,并能有效地在大型项目开发中帮助我们,同时Spring.NET也可以称为.NET应用程序中的“轻量级J2EE架构体系”。我撰写《Spring.NET学习笔记》系列博客的主要目的是为了推广Spring.NET框架,让更多的朋友掌握这个框架,因为Spring.NET的确是一个很好的框架。并希望越来越多的朋友加入到Spring.NET框架的学习和运用过程中。
因为个人原因,明天(11月21日)我要踏上回家的旅途,《Spring.NET学习笔记》系列博客尚有几篇未完工,我家乡所在的城市还不能上网,可能下次更新博客是在过年后,希望各位支持我、支持Spring.NET的朋友能够谅解。
在学习Spring.NET的过程中,一直有很多朋友支持我,尤其是《Spring.net小组》的朋友,希望喜欢Spring.NET的朋友能够加入这个充满热情的小组。
《Spring.NET学习笔记》系列博客主要参考 :
Spring.NET中文手册,Spring.NET1.3英文文档和Spring.NET官方网站