ASP.NET中促进代码重用的2种模式

开发复杂的动态ASP.NET应用程序时,必须尽量减少重复代码,提高应用程序的重用性和灵活性。在某些应用程序中,用户采取的不同操作可能具有不同的控制器逻辑,但结果都是相同的视图(例如显示一个产品列表时,可能允许用户增添或删除一件产品。但在控制器引导用户完成了添加或删除过程后,最终显示的都是同样的产品视图,其中含有修改过的数据)。 

开发可重用的程序逻辑时,第一步就是尽量减少服务器脚本页中的代码数量。脚本页中的逻辑很难(有时甚至不可能)重用,造成视图和控制器分离得不够好。另外,它的测试和调试也显得异常困难。所以,不要将脚本代码添加到一个.aspx页中,更有效的做法是使用类来实现控制器。这样可在整个Web应用程序中统一外观和导航机制,并可在整个应用程序的范围内重用表示(呈现)逻辑。

实现ASP.NET应用程序的控制类时,可采用两种不同的模式。在用Page Controller模式构建的应用程序中,导航模式是静态的,但网页是动态生成的。对于更复杂的应用程序,如果导航是动态的,或者要求根据一个规则集(例如用户权限或应用程序状态)来配置,那么使用Front Controller模式可获得一个更有效的实现。下面将详细讨论这两种模式。

Page Controller模式

使用Page Controller模式时,要由名为BaseController的一个中心类来实现需要的所有公共行为,以便处理HTTP请求、更新模型以及将请求转发给恰当的视图。BaseController提供的通用功能包括会话管理、安全性以及从查询字符串或隐藏字段中检索数据。针对Web应用程序中的每个链接,你都需要创建一个独立的PageController类,该类要从BaseController类继承。这些独立的PageController负责实现网页特有的任何行为,并直接使用已由BaseController实现的核心功能。

许多时候,你的应用程序可以分解成一系列公共网页类型,它们共享通用的逻辑。例如,你可能有一系列数据输入页或者网格视图页,它们全部共享相同的逻辑。在这种情况下,最好实现一个DataEntryController或者一个GridViewController,并要求它们从BaseController类继承。基于这些派生类,你可实现自己PageController,并使用现成的公共方法。但要注意的是,继承层次不能太复杂,否则应用程序逻辑会变得难以维护。为了尽量缩短继承链,你可创建一系列“助手类”,它们含有一系列公共代码,可在任何一个继承级别上调用。

为了实现Page Controller模式,你可从System.Web.UI.Page继承一个BaseController类,然后实现通用的应用程序功能。例如,BaseController可提供页眉、页脚和一些用户特有的信息(例如登录名称和部门等),从而实现一致的外观与感觉。接着可从这个BaseController类继承,并由继承的类(放在代码隐藏文件中)来实现网页所特有的逻辑,从而创建应用程序需要的每一个页。对于中等复杂程度的应用程序,如果它具有固定的导航路径,就尤其适合采用这一模式。相反,如果需要动态导航能力,则需要采用Front Controller模式。
 
Front Controller模式 

如果需要在多个网页之间进行合作式处理,Page Controller模式的效率会大打折扣,因为它要求为每个逻辑性的网页都实现一个对象。在这种情况下,Front Controller模式显得更有效,因为它用一个控制器来接收所有请求,然后通过一个处理程序和命令类的一个层次结构来引导请求。处理程序从HTTP请求中获取参数,选择正确的命令并执行之。每个命令对象都执行了指定的操作后,它判断需要用哪个视图来正确地呈现网页。通过实现Front Controller,可获得更集中的应用程序控制,因为所有网页请求都通过单独一个控制器,而非由不同的Page Controller进行处理。但这样做也不是没有代价的:如果处理程序进行一些高开销的处理,比如进行数据库查找,就可能导致整个应用程序的运行速度变慢。所以,处理程序应尽可能高效,而且只有在绝对必要时才使用外部资源。还应考虑对任何外部资源进行缓存,以提高处理程序的性能。

为了实现FrontController类,你需要创建一个Handler(处理程序)和一个CommandFactory,后者用于确定为了响应一个请求而需要执行的命令。ASP.NET提供了IHttpHandler接口,它允许开发者创建为传入的HTTP请求提供服务所需的自定义接口。为了实现Handler,你需要从System.Web.IHttpHandler继承,并添加相应的逻辑,以便从CommandFactory中实例化和调用恰当的命令。CommandFactory定义了一个命令集合,以及用于判断应该执行什么命令的逻辑。调用CommandFactory会返回恰当的Command对象,而Handler可调用该对象的Execute方法。采用这种模式,你可扩展CommandFactory逻辑,并创建附加的命令来处理不同的实际情况,从而创建出更可靠的导航机制,并集中地实现它们。

结构化模式

.NET结构师应尽可能地使用结构化模式。使用ASP.NET内建的特性,很容易就能实现Page Controller和Front Controller这样的模式。利用它们可获得具有高度重用性和扩展性的应用程序设计。对于这些模式以及其他结构化模式,要了解它们的更多信息以及ASP.NET实现的细节,请访问Microsoft .NET Architecture Center。
 

时间: 2025-01-29 13:24:21

ASP.NET中促进代码重用的2种模式的相关文章

Asp.net中的代码与表现分离

asp.net .NET Framework Version 2.0出来好久了,VS 2005 beta2也有了,近段时间一直在断断续续地玩Asp.net,发现刚学不久的东西马上就得更新,不更新还真不行. 先从Asp.net中的代码与表现分离说起,这是一个非常有用的功能,特别是在team work中,我想. 在 .NET Framework Version 1.0/1.1中,微软是这么教我们代码与表现分离的:1.首先要在.aspx文件的@Page指令中加入如下一行:<%@ Page Langua

asp.net中using代码语句解释

问题描述 asp.net中using代码语句解释 您好,麻烦帮我解释一下,在代码页面写代码时, 需要在页面的最前面加下面的语句 using JD.Model; 这一句有什么用途?非常谢谢?急用,辛苦了 解决方案 访问另一个命名空间里的类,需要写完整的命名空间,比如 JD.Model.XXX 为了简化,像使用自己的命名空间那样使用,直接写类名XXX即可.需要用using: using JD.Model 解决方案二: using JD.Model; 这个就是你要使用的那个的数据的包 那个包是开发这个

ASP.NET中MVC传递数据的几种形式总结_实用技巧

本文实例讲述了ASP.NET中MVC传递数据的几种形式.分享给大家供大家参考.具体如下: 在Asp.net mvc开发中,Controller需要向View提供Model,然后View将此Model渲染成HTML.这篇文章介绍三种由Controller向View传递数据的方式,实现一个DropDownList的显示. 第一种:ViewData ViewData是一个Dictionary.使用非常简单,看下面代码: public ActionResult ViewDataWay(int id) {

Xcode 中 Objective-C 代码的样式哪种更标准的对比分析

Xcode 中 Objective-C 代码的样式哪种更标准的对比分析 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. Xcode 中 Objective-C 代码的样式在不断升级过程中,示例代

分析在Worklight中开发本地功能的三种模式

文章将分析在 Worklight 中开发本地功能的三种模式:调用 Cordova 支持的本地功能:通过 Worklight common API 调用开发的本地功能:编写 Cordova 的插件,调用本地功能.然后通过相应的实例展现不同方法的使用模式,向读者展现 Worklight 在和本地功能结合上的能力.最后分析各自的优缺点和使用的环境. 纯 web 模式的局限性 在 Worklight 架构下,纯 web 模式虽然可以像本地应用一样被安装在手机上,但是所提供的服务和传统的网页相比,几乎没有

ASP.NET中的代码分离

asp.net|代码分离 ASP.NET中包含了一种新方法:将商业逻辑代码从表达代码中分离出来.这通常被称为背后的代码,功能非常强大,并且非常容易执行.实现步骤就是:向ASP.NET 页面中增加用户界面元素,并为它们指定属性"runat=server".然后,用.NET语言创建一个类文件来操作这些用户界面元素.最后,在ASP.NET 页面顶部增加一个指令,将用户界面与操作它的类文件附着在一起. 用一个简单的例子就能展示它是如何完成的.下面创建一个名叫WebPage.aspx的ASP.N

ASP.NET中共用代码

asp.net 在 ASP.NET 中由於可直接使用或替換 DLL 檔,大部分人較不關心動態共用原始碼的問題,由於 ASP.NET 在執行時可動態編譯最新原始碼供網站執行,是否一定要採用 DLL 來執行網頁對於管理者來說,沒有絕對的準則,但對系統或程式設計師來說,動態共用原始碼意味相同原始碼可供各專案同時共用,當在開發或維護某一專案時,針對共用原始碼的變動,亦等同於針對所有專案一起更新,此外亦可降低相同功能類似原始開發維護時間,有助於開發力的提升及專案小組共同開發. 例如早期專案存取資料庫可能以

ASP.NET与Javascript代码结合实现一种常用效果

asp.net|javascript Javascript的子父页访问.函数调用 效果:比如一个设备管理系统的某处要填入设备编号,但设备编号通常比较难记,而可能记住的只是哪个部门哪个位置的设备.因此,我们想在文本框旁边加一个按钮,点击之后弹出一个子页面,这里有设备编号.设备的各项详情对照的一个表格,我只要根据位置找到该设备,双击此记录,设备编号便填上去了. 实现过程: 父页面 打开新窗口的javascript函数为:     function openpage(htmlurl)     {   

关于ASP.NET中的缓存问题的几种方式

asp.net|缓存|问题 1)缓存 ASP.NET 页 1以编程方式操作 HttpCachePolicy 类. HttpCachePolicy.SetExpires HttpCachePolicy.SetCacheability |NoCache |Private |Public |Server |ServerAndNoCache |ServerAndPrivate 2<%@ OutputCache Duration="60" VaryByParam="None&qu