ASP.NET 中的設計模式之MVC篇

ASP.NET 中的設計模式之MVC

  • 設計模式

  • MVC

  • 頁面控制器

  • 模板與Page基類

設計模式

軟件開發中,軟件複用和團隊協作都一直是最爲人們關注的重要問題之一。有趣的是,這兩個似乎屬於軟件工程範疇的問題都有一個共同的技術方面的解決之道:設計模式。

 

 

在這裏,筆者無意對設計模式的含義進行過多介紹或者嚴格定義,只是給一個比較簡單的理解:設計模式是對一些經常出現問題的一種解決方式,這種解決方式來自於許多開發人員的經驗總結。

MVC—WEB開發中最基本的設計模式

在經典的設計模式書籍中,常用的設計模式有二三十種。就WEB應用程序開發來說,MVC可能是最基本的一種設計模式了。的確,WEB應用程序有一些特有的問題,瘦客戶端、不連續的狀態、對友善界面的關注,以及愈來愈多的終端設備

 

 

MVC將程序功能分成三部分考慮:視圖(VIEW,即可見的用戶界面部分)、模型(Model,程序的數據模型和業務邏輯部分),控制器(Controller,根據用戶輸入通知模型和視圖進行相應更改)。

 

 

MVCWEB應用程序的一個頁面分成若干部分,當對其中的一部分修改時,另外一部分可能只需要很少的變動甚至保持原樣,使得應用程序對需求變化的適應性更好。

 

 

此外,WEB應用程序往往既要實現美觀的用戶界面,又要實現精確複雜的商務邏輯,然而並不是所有的人都能同時做好這兩件事情。有了MVC,開發團隊成員間的協作就比較容易了。

ASP.NET中的MVC

ASP.NETMVC提供了支持。編寫代碼隱藏的網頁時,程序代碼被分爲兩部分:.ASPX頁面文件和一個單獨的類文件(.CS文件)

在圖1所示的例子中,用戶從下拉框選擇圖書類別,提交後,列出該類別下的書籍清單。

1  示例

視圖

此例子的View部分在.ASPX文件中:

模型和控制器

例子程序中的ModelController部分則在獨立的類文件中:

 

 

分離模型和控制器

代碼隱藏文件自動實現的MVC模式中,只是實現了ViewModel-Controller的分離,還沒有解決代碼複用問題。對此的解決方式是,進一步將模型和控制器分離。

將模型分離到單獨的類文件中,使其只包含與數據庫、業務邏輯相關的代碼,其它的頁面可很容易使用此代碼:

儘管頁面中的公共方法也可以在其它頁面調用,但不推薦該方式,因爲會導致頁面間的藕合度增加。

 

 

控制器部分的代碼仍然在代碼隱藏文件中,但其邏輯已經非常清晰:

 

對控制器和視圖的進一步重構

B/S結構的應用程序被分成了一個一個的頁面。開發過大一些應用程序的人可能都知道,在商業應用程序的不同頁面中,常常有許多相同的頁面元素需要保持一致,如Banner、菜單、頁腳等。此外,在不同的頁面上,也有許多非常相似的事情需要處理,它們可能包括:對用戶身份和權限的驗證、接收用戶傳遞的請求、對錯誤的處理,甚至可以包括更多(例如對緩存的處理)。顯然,這可以爲多個頁面共享的二者分屬於MVC中的不同範疇:界面屬於View,而事務的處理則屬於控制器。

 

 

在前面爲了實現複用,我們曾經將模型分離到了單獨的類文件中實現,而對於可能爲多個頁面共享的視圖和控制器,如果仍然爲每一個頁面都單獨編寫一個複雜而臃腫的視圖與控制器、或者在頁面間複製拷貝、或者互相調用不同頁面的成員,也都不是好的選擇。

模板技術

Web開發中,模板技術常常是人們用來解決視圖重用的一種較好選擇。其基本思想是爲多個頁面定義統一的外觀和佈局,然後在每個單獨的頁面加載過程中,用該頁面內容替換或者嵌入到模板內容中。

 

 

ASP.NET中,也可以使用模板方式。例如,圖2所示的頁面中,上面和左邊的部分都是站點多個頁面的公共部分,只有頁面中間的部分是每一個頁面單獨維護的內容。對此,可以採用模板方式,只在一個稱爲Template的視圖文件中編寫公共的外觀,而不需要在每一個頁面都重新把這些代碼複製一遍。

2  使用模板實現頁面的一個簡單例子

實現這個例子的模板代碼如下:

在這部分代碼中,是將頁面公共部分做成了控件,然後在模板中註冊。儘管在每一個頁面中註冊一遍控件所需代碼也不是很多,但通過模板維護公共部分有一個好處:可以更快速地改變整個應用程序的外觀、佈局、顏色等,也可以準備多個不同的模板,併爲不同的頁面選擇其合適的模板。

Page基類

要採用模板來實現頁面,除了要將模板的內容包含起來,往往還要在頁面中替換或者填充模板中的一些內容。這些裝載、轉換工作既然也是每一個頁面都要做的事情,當然也可以將它們放到一個單獨的類中實現,這就是Page基類。

Page基類在ASP.NET中的角色是公共的控制器。我們可以將每一個頁面都要實現的控制邏輯放到此處。

下面的代碼文件是實現圖2Page基類。

 

 

 

其它頁面繼承Page基類,而不是繼承默認的System.Web.UI.Page類。

 

公共的Page基類可以做很多事情,常見的如對錯誤(Exception)的處理、接收頁面傳遞的字段、URL與字符集轉換、增加客戶端腳本等。

在性能方面,使用ACT測試的結果表明,使用Page基類和模板技術帶來的性能損失非常有限。

最後,順便提到一下筆者認爲非常有意思的一點:在ASP.NET中,無論是模板、Page基類、還是獨立的頁面,都可以同時具有視圖文件(.aspx文件)和代碼文件(.cs文件)其中之一或者全部。例如,在微軟資助出版的ESP(即.NET企業解決方案模式)書籍中,就提供了另外一種Page基類,該page基類的視圖文件就是各個頁面的公共視圖,也相當於我們這裏的模板文件。ASP.NET中這種靈活的機制既爲大多數開發人員提供了方便,也同時增加了犯錯的可能---儘管你可以用多種方式實現同樣的功能,但最佳的方式是什麼呢?正如我們已經找到了複用MVC三者中任何一種的方式,但對於MVC究竟是分離還是合併到一起,仍然需要根據應用程序的複雜程度等實際情況做出選擇。

-------------------------------------------------------------------------------------------

Created by superhasty

2005/06/07

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章