本文内容
概述
背景
模块
使用场景
入门应用
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 框架核心的相关项目,提高开发者的效率。
https://www.cnblogs.com/liuning8023/archive/2012/07/07/2580616.html