天天看點

ASP.NET下MVC設計模式的實作

摘要:本文從視圖、控制器、模型三個方面簡要介紹了在asp.net環境下,經典mvc設計模式的實作,并讨論了mvc設計模式的擴充,最後對mvc的優點及不足之處進行了分析。

關鍵詞:設計模式、視圖、控制器、模型

asp.net是微軟最新推出的新型體系結構.net架構的一部分,它為構造新一代動态網站和基于網絡的分布式應用提供了強有力的支援。與以前的web開發模型相比,asp.net提供了許多重要的優點例如:簡易性;安全性;可管理性等。而且與基于過程的asp頁面技術相比,面向對象技術在asp.net中得到了完全實作。用傳統asp技術建立的web應用執行個體中,在頁面中同時實作顯示,業務邏輯和流程控制,這從工程化的角度考慮,它有許多不足之處。使用者界面承擔着向使用者顯示問題模型和與使用者進行操作和i/o互動的作用。使用者希望保持互動操作界面的相對穩定,但更希望根據需要改變和調整顯示的内容和形式。在.net架構下asp.net技術結合mvc設計模式很好地解決了上述問題。

1mvc設計模式簡介

mvc由trygvereenskaug提出,首先被應用在smalltalk-80環境中,是許多互動和界面系統的構成基礎。mvc結構是為那些需要為同樣的資料提供多個視圖的應用程式而設計的,它很好的實作了資料層與表示層的分離。mvc作為一種開發模型,通常用于分布式應用系統的設計和分析中,以及用于确定系統各部分間的組織關系。對于界面設計可變性的需求,mvc(model-view-controller)把互動系統的組成分解成模型、視圖、控制器三種部件。

視圖部件把表示模型資料及邏輯關系和狀态的資訊以特定形式展示給使用者。它從模型獲得顯示資訊,對于相同的資訊可以有多個不同的顯示形式或視圖。

控制器部件是處理使用者與軟體的互動操作的,其職責是控制提供模型中任何變化的傳播,確定使用者界面于模型間的對應聯系;它接受使用者的輸入,将輸入回報給模型,進而實作對模型的計算控制,是使模型和視圖協調工作的部件。

模型部件儲存由視圖顯示,由控制器控制的資料;它封裝了問題的核心資料、邏輯和功能的計算關系,它獨立于具體的界面表達和i/o操作。

模型、視圖與控制器的分離,使得一個模型可以具有多個顯示視圖。如果使用者通過某個視圖的控制器改變了模型的資料,所有其它依賴于這些資料的視圖都應反映到這些變化。是以,無論何時發生了何種資料變化,控制器都會将變化通知所有的視圖,導緻顯示的更新。這實際上是一種模型的變化-傳播機制。模型、視圖、控制器三者之間的關系和各自的主要功能,如圖1所示。

2mvc設計模式的實作

asp.net提供了一個很好的實作這種經典設計模式的類似環境。開發者通過在aspx頁面中開發使用者接口來實作視圖;控制器的功能在邏輯功能代碼(.cs)中實作;模型通常對應應用系統的業務部分。在asp.net中實作這種設計而提供的一個多層系統,較經典的asp結構實作的系統來說有明顯的優點。将使用者顯示(視圖)從動作(控制器)中分離出來,提高了代碼的重用性。将資料(模型)從對其操作的動作(控制器)分離出來可以讓你設計一個與背景存儲資料無關的系統。就mvc結構的本質而言,它是一種解決耦合系統問題的方法。

2.1視圖

視圖是模型的表示,它提供使用者互動界面。使用多個包含單顯示頁面的使用者部件,複雜的web頁面可以展示來自多個資料源的内容,并且網頁人員,美工能獨自參與這些web頁面的開發和維護。

在asp.net下,視圖的實作很簡單。可以像開發windows界面一樣直接在內建開發環境下通過拖動控件來完成頁面開發本。本文中介紹每一個頁面都采用複合視圖的形式即:一個頁面由多個子視圖(使用者部件)組成;子視圖可以是最簡單html控件、伺服器控件或多個控件嵌套構而成的web自定義控件。頁面都由模闆定義,模闆定義了頁面的布局,使用者部件的标簽和數目,使用者指定一個模闆,平台根據這些資訊自動建立頁面。針對靜态的模闆内容,如頁面上的站點導航,菜單,友好連結,這些使用預設的模闆内容配置;針對動态的模闆内容(主要是業務内容),由于使用者的請求不同,隻能使用後期綁定,并且針對使用者的不同,使用者部件的顯示内容進行過濾。使用由使用者部件根據模闆配置組成的組合頁面,它增強了可重用性,并原型化了站點的布局。

視圖部分大緻處理流程如下:首先,頁面模闆定義了頁面的布局;頁面配置檔案定義視圖示簽的具體内容(使用者部件);然後,由頁面布局政策類初始化并加載頁面;每個使用者部件根據它自己的配置進行初始化,加載校驗器并設定參數,以及事件的委托等;使用者送出後,通過了表示層的校驗,使用者部件把資料自動送出給業務實體即模型。

這一部分主要定義了web頁面基類pagebase;頁面布局政策類pagelayout,完成頁面布局,用于加載使用者部件到頁面;使用者部件基類usercontrolbase即使用者部件架構,用于動态加載檢驗部件,以及實作使用者部件的個性化。為了實作web應用的靈活性,視圖部分也用到了許多配置檔案例如:置檔案有模闆配置、頁面配置、路徑配置、驗證配置等。

2.2控制器

為了能夠控制和協調每個使用者跨越多個請求的處理,控制機制應該以集中的方式進行管理。是以,為了達到集中管理的目的引入了控制器。應用程式的控制器集中從用戶端接收請求(典型情況下是一個運作浏覽器的使用者),決定執行什麼商業邏輯功能,然後将産生下一步使用者界面的責任委派給一個适當的視圖元件。

用控制器提供一個控制和處理請求的集中入口點,它負責接收、截取并處理使用者請求;并将請求委托給分發者類,根據目前狀态和業務操作的結果決定向客戶呈現的視圖。在這一部分主要定義了httpreqdispatcher(分發者類)、httpcapture(請求捕獲者類)、controller(控制器類)等,它們互相配合來完成控制器的功能。請求捕獲者類捕獲http請求并轉發給控制器類。控制器類是系統中處理所有請求的最初入口點。控制器完成一些必要的處理後把請求委托給分發者類;分發者類分發者負責視圖的管理和導航,它管理将選擇哪個視圖提供給使用者,并提供給分發資源控制。在這一部分分别采用了分發者、政策、工廠方法、擴充卡等設計模式。

為了使請求捕獲者類自動捕獲使用者請求并進行處理,asp.net提供低級别的請求/響應api,使開發人員能夠使用.net架構類為傳入的http請求提供服務。為此,必須創作支援system.web.ihttphandler接口和實作processrequest()方法的類即:請求捕獲者類,并在web.config的<httphandlers>節中添加類。asp.net收到的每個傳入http請求最終由實作ihttphandler的類的特定執行個體來處理。ihttphandlerfactory提供了處理ihttphandler執行個體url請求的實際解析的結構。http處理程式和工廠在asp.net配置中聲明為web.config檔案的一部分。asp.net定義了一個<httphandlers>配置節,在其中可以添加和移除處理程式和工廠。子目錄繼承httphandlerfactory和httphandler的設定。http處理程式和工廠是asp.net頁架構的主體。工廠将每個請求配置設定給一個處理程式,後者處理該請求。例如,在全局machine.config檔案中,asp.net将所有對aspx檔案的請求映射到httpcapture類:

<httphandlers>

...

<addverb="*"path="*.aspx"type="sys.ui.httpcapture,sys.ui"/>

</httphandlers>

2.3模型

mvc系統中的模型從概念上可以分為兩類――系統的内部狀态和改變系統狀态的動作。模型是你所有的商業邏輯代碼片段所在。本文為模型提供了業務實體對象和業務處理對象:所有的業務處理對象都是從processbase類派生的子類。業務處理對象封裝了具體的處理邏輯,調用業務邏輯模型,并且把響應送出到合适的視圖元件以産生響應。業務實體對象可以通過定義屬性描述用戶端表單資料。所有業務實體對象都entitybase派生子類對象,業務處理對象可以直接對它進行讀寫,而不再需要和request、response對象進行資料互動。通過業務實體對象實作了對視圖和模型之間互動的支援。實作時把"做什麼"(業務處理)和"如何做"(業務實體)分離。這樣可以實作業務邏輯的重用。由于各個應用的具體業務是不同的,這裡不再列舉其具體代碼執行個體。

3mvc設計模式的擴充

通過在asp.net中的mvc模式編寫的,具有極其良好的可擴充性。它可以輕松實作以下功能:

①實作一個模型的多個視圖;

②采用多個控制器;

③當模型改變時,所有視圖将自動重新整理;

④所有的控制器将互相獨立工作。

這就是mvc模式的好處,隻需在以前的程式上稍作修改或增加新的類,即可輕松增加許多程式功能。以前開發的許多類可以重用,而程式結構根本不再需要改變,各類之間互相獨立,便于團體開發,提高開發效率。下面讨論如何實作一個模型、兩個視圖和一個控制器的程式。其中模型類及視圖類根本不需要改變,與前面的完全一樣,這就是面向對象程式設計的好處。對于控制器中的類,隻需要增加另一個視圖,并與模型發生關聯即可。該模式下視圖、控制器、模型三者之間的示意圖如圖2所示。

圖2 視圖、控制器、模型三者之間關系的示意圖

同樣也可以實作其它形式的mvc例如:一個模型、兩個視圖和兩個控制器。從上面可以看出,通過mvc模式實作的應用程式具有極其良好的可擴充性,是asp.net面向對象程式設計的未來方向。

4mvc設計模式的優點及不足之處

4.1mvc的優點

mvc的優點展現在以下幾個方面:

(1)可以為一個模型在運作時同時建立和使用多個視圖。變化-傳播機制可以確定所有相關的視圖及時得到模型資料變化,進而使所有關聯的視圖和控制器做到行為同步。

(2)視圖與控制器的可接插性,允許更換視圖和控制器對象,而且可以根據需求動态的打開或關閉、甚至在運作期間進行對象替換。

(3)模型的可移植性。因為模型是獨立于視圖的,是以可以把一個模型獨立地移植到新的平台工作。需要做的隻是在新平台上對視圖和控制器進行新的修改。

(4)潛在的架構結構。可以基于此模型建立應用程式架構,不僅僅是用在設計界面的設計中。

4.2mvc的不足之處

mvc的不足展現在以下幾個方面:

(1)增加了系統結構和實作的複雜性。對于簡單的界面,嚴格遵循mvc,使模型、視圖與控制器分離,會增加結構的複雜性,并可能産生過多的更新操作,降低運作效率。

(2)視圖與控制器間的過于緊密的連接配接。視圖與控制器是互相分離,但确實聯系緊密的部件,視圖沒有控制器的存在,其應用是很有限的,反之亦然,這樣就妨礙了他們的獨立重用。

(3)視圖對模型資料的低效率通路。依據模型操作接口的不同,視圖可能需要多次調用才能獲得足夠的顯示資料。對未變化資料的不必要的頻繁通路,也将損害操作性能。

(4)目前,一般進階的界面工具或構造器不支援mvc模式。改造這些工具以适應mvc需要和建立分離的部件的代價是很高的,進而造成使用mvc的困難。

5結束語

與軟體所處理問題的内在模型相比較,使用者界面是需要經常發生變化的,采用mvc設計模式可以在滿足對界面要求的同時,使軟體的計算模型獨立于界面的構成。也可以基于此模型建立大型分布式應用程式架構。本文介紹了mvc設計模式的原理;mvc設計模式三個組成構件(模型部件、視圖部件和控制部件)以及在asp.net環境下實作基于mvc的應用需要完成的工作;mvc設計模式的擴充;最後對mvc的優點及不足之處進行了分析。

繼續閱讀