ASP.NET 与 Design Pattern
Draft-2003-03-26
本文的读者对象为熟悉 ASP.NET 的中、高级开发人员与系统构架工程师
本文详细讨论了基于 ASP.NET 的系统的设计模式和软件体系构架。
ASP.NET 简介 ... 1
完美 Web Tier Application 的设计目标 ... 2
解决之道 ... 3
ASP.NET 的设计模式 ... 3
1 、用户界面与应用逻辑的分离 ... 4
2 、提供中心控制机制 ... 4
3 、给单元测试和维护提供的有效的机制 ... 5
4 、提高系统中各种组件的可复用性 ... 5
5 、减少培训的时间和成本 ... 5
Web Application Framework . 5
简介 ... 5
关键技术 ... 6
意见与反馈 ... 7
基于 Microsoft 平台的软件工程师和软件厂商已渐渐将开发的平台转移到 .NET 上,特别是在 Web 的编程方面, ASP.NET 已被广泛的采用。
ASP.NET 的出现给其相应的设计模式带来一个真空地带。人们在学习 ASP.NET 的同时,却有可能忽略对其相应的设计模式的研究与学习,正如最初使用 J2EE 时,工程师们在新的编程模型下感到不知所措。在本文主要探讨 ASP.NET 的应用带来的设计模式上的转变。
ASP.NET 简介
由于本文的目的不是教会读者如何使用 ASP.NET ,所以下面仅对 ASP.NET 中基于事件驱动的编程模型加以介绍。
ASP.NET 的核心 WebForm 采用了事件驱动的编程模式,这对于习惯与采用 ASP 编写 Web 程序的软件工程师来说,将是一种根本的编程思路的改变,如果不能改变,你将很难掌握 ASP.NET 的精髓。
事实上 WebForm 的事件驱动模型与 Windows 窗口的基于消息的编程模式非常类似。这也看出 WebForm 的设计者的设计意图。下表对 Page 中的事件和 Dialog 事件进行了对比:
Page ** 事件 **
|
Dialog ** 事件 **
---|---
Page_Init
|
INIT_DIALOG
Page_Load
|
WM_SHOW
Render
|
WM_PAINT
同时 Page 中的 WebControl ,与 Dialog 中的各种控件也十分类似,都可以设置特定的消息处理函数。
所以,如果在设计、编写 WebForm 时,更多的将 WebForm 想象成 Dialog 则会大有益处。
由此可见 ASP.NET 的事件驱动模型,给 Web Tier Application 的设计模式带来了重大的转变,你不可能在沿用 ASP 的设计思路和方法。
完美 Web Tier Application 的设计目标
长期以来, Web Tier Application 的混乱与复杂,使得人们耿耿于怀,甚至使得软件高手们编写 Web Tier Application 的兴趣与日俱减。无论你采用何种技术 ASP, JSP, CGI, PHP , HTML ,都不可能使得程序结构清晰易于维护。
一个完美的 Web Tier Application 的体系构架应具有以下特点:
1、 用户界面与应用逻辑的分离,有效的隔离开发人员的角色。用户界面与应用逻辑的紧密耦合是 Web 应用程序的天生缺陷,在编写 CGI 时甚至要使用 printf 将整个页面输出。为了追求 Web 页面的完美通常界面的设计与应用逻辑的实现是两种类型的工程师。一个擅长使用 Photoshop 与 Dreamwave 毕业于艺术院校,一个只懂得 C ++与 Java 整天敲击键盘,要让这两种人才合并简直是 Mission Impossible 。在这种背景下,用户界面与应用逻辑紧密耦合的矛盾与日俱增,同时能使这两种开发人员的工作有效分离的设计模式将会大大提高生产效率。
2、 提供中心控制机制。 Web 页面之间相互连接,这在给用户提供方面的同时使得整个系统难以维护,系统逻辑混乱。好的设计模式应提供中心控制机制,减少页面间耦合,系统逻辑清晰。
3、 给单元测试和维护提供的有效的机制。
4、 提高系统中各种组件的可复用性。目前通常采用配置的方式提高组件的可复用性,一个标准的组件只要经过简单的配置即可应用在不同的系统中。
5、 减少培训的时间和成本。
解决之道
目前对 Web Tier Application 的设计模式主要有两种,它们是 Microsoft 的 .NET ASP 和 Sun 的 Web Tier Application Framework 。 Sun 的 Web Tier Application Framework 为 JSP 和 Servelet 的 Web 编程提供了较好的解决方案。
对两种模式优略的比较,非我的能力所及,也不是本文讨论的要旨。下面将着重讨论 ASP.NET 的设计模式。
ASP.NET 的设计模式
将 ASP.NET 与传统的 Windows 应用程序来比较,将有助于建立良好的设计思路,这也是设计结构良好的 ASP.NET 应用的关键。 Windows 应用程序很好的解决了前面提出的问题,界面与逻辑的分离、中心控制机制、可以进行有效的单元测试等;最重要的是 WebForm 与 Windows 应用程序有太多的相似之处,你完全可以将许多以前的经验应用到 WebForm 中。
下图将 ASP.NET 与 Windows 应用程序对应起来将更易于对 ASP.NET 设计模式的理解。
由此可见:
- Web Page 的 Header bar 可以和应用程序 Menu bar 对应,他们都起着大的功能点的跳转作用。
- Bottom Bar 可以和 Status Bar 对应可以显示一些不重要的信息如 Copyright 等。
- Web Page 的主体部分,在 ASP.NET 中的 WebForm 可以和 Dialog 对应。如前所述 WebForm 基于事件驱动的编程模式与 Dialog 及其类似。
这种设计模式利用到了 page template 技术,具体实现如下图所示:
由于 ASP.NET 支持自定义的 WebControl ,可以实现
1<waf:header> <waf:bottom>, Microsoft 在其实现的 PetStore 中,有相应的实例代码这里将不再讨论。
2
3下面就前文中提出的设计目标详细讨论 ASP.NET 的解决方案:
4
5###### 1 、用户界面与应用逻辑的分离
6
7ASP.NET 已很好的解决了这个问题,界面保存在 *.aspx 文件中,而事件的处理代码保存在 *.aspx.cs 中,可以在 *.aspx 中用如下代码建立连接。
@ Page language="c#" Codebehind="waf_ctrl.aspx.cs" Inherits="waf.WAFControl"
1
2在设计和实现 WebForm 时,应尽量将代码放入 *.aspx.cs 中。
3
4###### 2 、提供中心控制机制
5
6ASP.NET 似乎没有提供一种中心控制机制,从 Microsoft 实现的 PetStore 中可以看出,页面之间的相互连接关系十分复杂,如下图所示,页面之间是一种网状关系。对于大型的应用系统此情况将会更加糟糕。 Waf 提供的中心控制机制,下一章将着重介绍。
7
8
9
10###### 3 、给单元测试和维护提供的有效的机制
11
12WebForm 的事件驱动机制,已经将各个功能单元的耦合减到最小。如比较常见的用户注册功能,你可以将用户的注册界面、信息填写、审核、在数据库中的保存等功能,在一个 *.aspx 、 aspx.cs 和 *.cs 中完成,就如同在传统的 Dialog 中一样,这将使系统更加易于测试。
13
14###### 4 、提高系统中各种组件的可复用性
15
16ASP.NET 为开发常见标准组件提供了良好的基础。在系统设计中应设计、实现更多的标准组件,并通过配置的方式使其更加标准化。
17
18###### 5 、减少培训的时间和成本
19
20如果你熟悉传统的 Windows 窗口编程技术,你会发现以前的很多经验可以应用到 ASP.NET 中。
21
22### Web Application Framework
23
24###### 简介
25
26Web Application Framework ( WAF )是一种基于 ASP.NET 的软件体系结构。其提供一种中心控制机制不但可以使系统逻辑清晰,代码易于维护,其还有如下益处:
27
281、 系统功能易于扩展
29
302、 支持集中身份认证
31
323、 易于授权
33
344、 易于审计
35
36WAF 采用 Mediator 和 Command 设计模式,实现了一种标准的可配置的控制组件,此种设计模式可使让 .NET 在 MVC 的软件系统结构下更好的工作。使用此设计模式后整个 Web 应用将呈现如下结构:
37
38
39
40其中
41
421、 Waf_ctrl.aspx 是整个系统的唯一入口点
43
442、 Waf_ctrl.aspx 通过请求参数中的 Cmd ,确定处理请求的页面,并将请求转发给此页面。
45
463、 Cmd 及执行 Cmd 的页面可以通过配置完成。
47
48###### 关键技术
49
50** 1、 ** ** Command **
51
52WAF 采用 Command 的方式达到中心控制、避免页面间相互连接的目的。
53
54对于每个页面,其所需要了解的就是命令,每个页面可以
55
561、 接受并执行命令。
57
582、 在 <a href="”…”"> 或 <form action=""> 中指定处理用户请求的命令
59
603、 直接发送命令。
61
62如一个用户 Login 页面 login.aspx
63
641、 首先其接受并执行 Login</form></a></waf:bottom></waf:header>