本文内容
- 概述
- 背景
- 模块
- 使用场景
- 入门应用
- Spring.NET 相关项目
本文正式开始前,我以目前所能想到的、此时此刻能想到的,先简单说下,为什么会有像 Spring.Net 这样的东西。首先,第一反应,Spring.Net 可能跟 Java 里的 Spring 有关——它是 Java Spring 的 .Net 版本。但不是简单的移植。其次,Java 的起步、发展和流行比 C# 要早。C# 1.0 远远不如 Java(此话不是我说的,而是普遍认为),直到 C# 2.0。那么,Java 里好的编程实践,在 C# 中也一样适用。
另外,当我采用面向对象编程时,接下来遇到的问题是,我如何定义类,并将它们很好的组织起来?才能使我的代码更容易维护,包括:
- 容易修复 BUG;
- 修复 BUG 后,不会产生新的 BUG;
- 应付不断变化的需求;
- 应付未来软件的变化;
- 可读性好,其他人能很快了解你程序的总体思路等等。
刚刚开始职业生涯时,每走一步,都会遇到困难。实在不知道如何选择。代码,感觉这么写行,那么写也行……
直到看到“设计模式”。根据每个模式描述,你可以结合自己场景来选择。比如:
- 当你自己的程序,遇到像“算法”封装问题时,可以使用策略模式;
- 当你自己的程序,遇到像“改造之前系统”,或利用现有类,重新组合成一个新的类等问题时,可以使用外观模式;
- 当你自己的程序,遇到像“订阅”这样问题时,可以使用观察者模式;
- 当你自己的程序,遇到像仅仅只需要一个实例时,可以使用单件模式等等。
之后,你会发现,设计模式是很有用。但它还是需要你,利用 .Net 框架提供的基类,根据你的场景来重新组织你自己的类——从零开始,设计自己程序。就像架构师做的工作一样。但不是全部,仅仅是架构师最基本的工作。
复用是我们一直追求的目标之一。
可是,真有这个必要吗?除了核心的业务部分,我要重写日志子系统/程序集/相关类;重写监控子系统/程序集/相关类;重写缓存子系统/程序集/相关类;重写并发事务子系统/程序集/相关类等等,就算不是企业级应用程序,这几个方面的功能我也需要啊。无论是否是客户需要的,对于一个完整的、健壮的应用程序来说,都是需要的。
也许,这些子系统/程序集/相关类在接下来的项目中可以复用。比如引用现成的程序集,添加现有类。我们不能保证,这样的复用,之前的代码完全不用改动。但这样的方式,远远不够。我们需要在更高的层次,在架构上达到复用。无论什么样的应用程序,总有那么几个“方面的功能”是需要的。如果可以将这些“方面的功能”,可以随意加进自己的项目,那就太好了——面向方面编程。
Spring.Net 这样的东西可以为我们做到。
概述
Spring.NET 应用程序框架为企业级开发提供全面的基础框架支持。它去掉使用基类库附带的复杂性完成最佳的、简单的实践,如测试驱动开发。Spring.NET 由 http://www.springsource.com/ 创建、支持和维护。
Spring.NET 的设计是基于 Java 版本的 Spring 框架,在世界范围内很多企业级应用程序中使用。Spring.net 不是简单的移植,它是不依赖于具体平台,并基于已验证的体系结构和设计模式。Spring.net 功能的广度跨越应用程序各个层(application tier),让你可以把它当作“一站式(one stop shop)”,但不是必需的。Spring.net 不是一个要么完全不用,要么得全部使用的解决方案。你可以单独使用它的模块。稍后描述这些模块。
企业级应用程序通常由很多各种的物理层(physical tiers )组成,在每个层内,功能通常被拆分到功能层(functional layers)。如业务层(business service layer)使用数据访问层(data access layer)中的一个对象来完成一个用例(use-case)或应用。无论如何构建你的应用程序,在一天结束时,会有各种各样相互协作的对象,以形成适当的应用。因此,应用程序中的对象是彼此依赖的。
tier 是“层”的意思,但 layer 也是“层”。它们不同。类似于“婚礼蛋糕”与“生日蛋糕”的区别。虽然都是分层的,但从来没见过“婚礼蛋糕”做得像“生日蛋糕”似的。比如,我们说网络七层协议(OSI)时使用的是 layer。
如上所述,官方文档,在谈论硬件时,使用 tier,而在谈论软件结构时,则使用 layer。
.NET 平台为构建应用程序提供了丰富的功能,从基本类型和基类(定义新类)到功能完善的应用程序服务和 Web 框架,都有很好的支持。但 .NET 平台并没有提供任何管理基础应用的模块,并将它们组合成一个相互协作的整体,这只能依靠架构师或开发人员自己完成。诚然,目前有很多用于设计业务系统的设计模式,将各种类或对象组合成能正常工作的完整的应用,如工厂模式、抽象工厂模式、生成器模式、装饰者模式及服务定位(Service Locator)等,这些模式已被软件行业广泛接受。虽然,这些模式非常好,但也不过是些命了名的最佳编程方式而已。很多相关资料都会介绍这些模式的作用、应用场景、解决的问题等等。经过仔细研读,应用到我们的自己系统中。
Spring.NET 的控制反转(Inversion of Control,IoC)容器所解决的正是如何在企业级应用中将类、对象和服务组合成应用程序。IoC 容器通过普遍认同的方式将分散的组件组合成完整的应用程序。Spring.NET 框架所采用的都是被业界公认的、已经被定型的最佳编程方式。实际上,这些模式已经成为经典,通过 Spring.NET,我们可以直接将它们整合到我们自己的应用程序中。目前,已有很多组织和机构用 Spring 框架开发出了健壮、易于维护的应用程序。
以往,我们用 .NET 开发应用程序,都是利用 .NET framework 提供的类库,然后,设计自己的类,以及类之间的组织方式。但软件开发实践表明,有些功能是软件常用的,无论出于何种需要,比如日志、性能监控、并发事务等等。这些常用的功能就是所谓的“方面”。Spring.Net 为我们直接提供了很多“方面”,可以将这些现成的“方面”集成到我们自己的应用程序。
背景
2004 年初,Martin Fowler 问他网站的访问者:何时需要控制反转:“问题是,控制的哪些方面是反转的?”之后,Fowler 建议重新命名(或至少给出一个更能自我描述的名字),于是,开始使用术语“依赖注入”。此后,他的文章继续解释控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)原则的思想基础。
若想了解依赖注入(IoC)和控制反转(DI),请参看文章 http://martinfowler.com/articles/injection.html。
“控制反转(Inversion of Control,IoC)”和依赖注入(Dependency Injection,DI)意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。
模块
Spring.NET 模块如下表所示,可以让我们大概了解 Spring.NET 都能做什么。
模块 | 描述 |
Spring.Core | Spring.Core 是框架最基本的部分,通过依赖注入让你配置你的应用程序。下面的功能都基于这里。 |
Spring.Aop | 使用该模块完成“面向方面编程(Aspect-Oriented Programming,AOP)”。AOP 集中于应用程序中有针对性的常见功能。Spring 的“方面”库提供预定义的、易于使用的应用,比如事务、日志、性能监控、高速缓存、方法重试和异常处理。 |
Spring.Data | 该模块以更高的效率和一致性实现在 ADO.NET 中数据访问功能,和完成声明式事务管理。 |
Spring.Data.NHibernate | 该模块把 NHibernate 与 Spring 声明式事务管理功能集成在一起,很容易在同一个事务内混合使用 ADO.NET 和 NHibernate 操作。NHibernate 1.0 用户将通过易于使用的 API 来完成数据访问操作。 |
Spring.Messaging | 该模块可与微软消息队列中间件(Microsoft MSMQ message queing middleware)交互,提高抽象层次。 |
Spring.Messaging.NMS | 该模块可与 Apache 消息队列中间件(Apache ActiveMQ (NMS) message queing middleware)交互,提高抽象层次。 |
Spring.Messaging.EMS | 该模块可与 Tibco 企业级消息服务队列中间件(Tibco Enterprise Message Service (EMS) message queing middleware)交互,提高抽象层次。 |
Spring.Web Spring.Web.Extensions | 当编写 ASP.NET Web 应用程序时,可以更有效地解决之前使用 ASP.NET 不便的地方,如数据绑定、验证和 ASP.NET 页面(page)/控件(control)/模块(module)/提供者(provide)的配置,提高抽象层次。 |
Spring.Web.Mvc | 该模块可以把 Spring.Core 和 Spring.Aop 模块的功能集成到你的 ASP.NET MVC 2 项目。 |
Spring.Web.Mvc3 | 该模块把 Spring.Core 和 Spring.Aop 模块的功能集成到你的 ASP.NET MVC 3 项目。 |
Spring.Services | 该模块适应一般的 CLR 对象,这样就可以被一个分布式通信技术使用,例如 .NET Remoting、Enterprise Services 和 ASMX Web Services。这些服务可以通过依赖注入来配置,并应用 AOP 来“装饰”。 |
Spring.Testing.NUnit | 该模块使用 NUnit 完成集成测试。 |
Spring.Testing.MSTest | 该模块使用 MSTest 完成集成测试。 |
Spring.Scheduling.Quartz | 该模块支持与 Quartz.NET 作业调度基础框架进行交互。 |
Spring.Core 模块还包含如下额外功能:
- 表达式语言(Expression Language) - 提供高效的查询,以及在运行时操作对象图表。这是配置对象注入的新方式,即以 "#{…}" 作分界符,分界符里边的内容是表达式语言;
- 验证框架(Validation Framework)- 为业务对象以编程或声明式创建复杂的验证,提供强大的用户界面的框架;
- 数据绑定框架(Data binding Framework)- 为完成数据绑定,提供用户界面框架;
- 动态反射(Dynamic Reflection)- 提供高性能反射的 API;
- 线程(Threading)- 提供额外的并发抽象,如线程的阀门(Latch)、信号量(Semaphore)和线程本地存储(Thread Local Storage);
- 资源抽象(Resource abstraction)- 提供通用接口以一个多态和与协议无关的方式把文件或 URL 看作是 InputStream。
使用场景
你可以在很多场景,从简单独立的控制台应用程序,到利用 Spring 的事务管理功能和集成 Web 框架的全面的企业级应用程序,创建程序块。
需要注意的是,Spring 框架并不强制你使用它里边的所有东西;它不是一个要么不用,要么全用的解决方案。现有的通过标准 ASP.NET 创建的前端(界面),通过 Spring 提供的事务和/或数据访问功能,可以与基于 Spring 的中间件很好地集成在一起。你需要做的唯一事情是,使用 Spring 的控制反转容器连接你的业务逻辑,并使用 WebApplicationContext 把它集成到你的 Web 层,以便找到中间层服务和/或用依赖注入配置你的 ASP.NET 页面。
虽然,Spring 框架不会强制任何特定的应用程序架构,但它鼓励一个区分表现层、服务层、数据访问层和数据库层的、有良好分层的应用程序架构。
入门应用
Spring.Net 有几个示例程序,在其安装目录。这些示例展示了 Spring.Net 的各个特性。
如果你已熟悉依赖注入、AOP,或有使用 Spring 框架 Java 版本的经验,那么你可以跳过这些示例。
- Movie Finder - 利用 Spring 的控制反转容器,演示依赖注入技术
- 应用程序上下文(Application Context)- 演示 IoC 容器,如本地化、ResourceSet 对象的访问,以及把资源应用到对象属性
- 面向方面编程(Aspect Oriented Programming)- 演示利用 AOP 框架向现有的对象添加额外的行为
- 分布式计算(Distributed Computing)- 演示远程服务事务的计算器,使你通过 .NET Remoting、Web 服务,或一个企业级服务组件导出一个普通的 CLR 对象(POCO)。同时,也演示了相应的客户端代理
- WCF - 展示一个 WCF 基于计算器的例子,通过依赖注入配置 WCF 服务和应用 AOP 通知
- Web Application - SpringAir - 该机票预订系统演示了 ASP.NET 框架,展示 ASP.NET 页面、数据绑定、验证和本地化的依赖注入
- Web Development - 演示在 ASP.NET 中使用依赖注入和Spring 的双向数据绑定的初级例子
- ASP.NET MVC2 - 演示把依赖注入和容器集成到 ASP.NET MVC 2 的初级例子
- ASP.NET MVC3 - 演示把依赖注入和容器集成到 ASP.NET MVC 3 的初级例子
- 数据访问(Data Access)- 演示如何简化基于数据访问层的 ADO.NET 框架
- 事务管理(Transaction Management)- 演示为本地和分布式事务在 .NET 中使用声明式事务管理
- AJAX - 演示如何在客户端 JavaScript 中,把 webservice 作为一个普通的 CLR 对象(POCO)访问
- NHibernate Northwind - 演示简化 NHibernate 使用的 Spring NHibernate 集成。Web 层(web tier)也包含了如何使用 Open-Session In View approach 在 Web 层进行会话管理
- Quartz Quickstart - 演示使用 Quartz.NET 集成进行调度
- MSMQ - 演示 MSMQ
- NMS - 演示 NMS
Spring.NET 相关项目
除了 Spring.NET 项目本身,还有很多与其相关的项目。这些项目提供超出核心 Spring.NET 框架的额外功能。从增强配置工具和库,到 REST 客户端,以支持额外的消息框架和标准。如下表所示。
Spring.NET CodeConfig | 通过标准的 .NET 代码,而不是 XML 配置,提供配置 Spring 容器的功能 See http://springframework.net/codeconfig/ for resources, downloads, and more information |
Spring.NET REST Client | 简化与 HTTP 服务器之间的通信,执行 RESTful。它处理 HTTP 连接,使应用程序代码提供的网址(可能是模板变量),并提取结果。 See http://springframework.net/rest/ for resources, downloads, and more information |
Spring.NET AMQP | supports the Spring programming model with AMQP, especially but not limited to RabbitMQ See http://springframework.net/amqp/ for resources, downloads, and more information |
Spring.NET Visual Studio Add-In | 在 VS.NET 2010 中,提供发布 Spring XML 配置的智能感知帮助 See http://springframework.net/vsaddin/ for resources, downloads, and more information |
鼓励 Spring.NET 使用者开发超出 Spring.NET 框架核心的相关项目,提高开发者的效率。