有關ASP.NET MVC框架的一些基礎知識
MVC(模型—視圖—控制器)結構模式把一個應用程序拆分成三個主要組件:模型、視圖和控制器。在創建基于MVC框架的Web應用程序時,你可以把ASP.NET MVC框架作為ASP.NET Web表單模式方案的一種重要候選。較之于基于Web表單的應用程序,ASP.NET MVC框架是一個輕量級的、測試性強的描述框架,它能夠與現有ASP.NET特征(例如母版頁面和基于成員身份的認證)緊密集成。MVC框架定義于System.Web.Mvc命名空間中。
長時間以來,MVC是一種為眾多開發人員所熟悉的標準設計模式。一些類型的Web應用程序受益于MVC框架,而另一些將繼續使用基于Web表單與回寄技術的傳統型ASP.NET應用程序模式,還有一些類型的Web應用程序則有可能把這兩種模式結合到一起使用。總之,MVC框架方案與Web表單方案并非相互排斥的。
總體來看,MVC框架包括下列組件:
(一)模型。模型對象是實現應用程序數據域邏輯的部分。經常情況下,模型對象還負責從數據庫中檢索和存儲模型狀態。例如,一個產品對象有可能從一個數據庫中檢索信息,操作其中的數據,然后把更新信息寫回SQL Server數據庫中的某一個產品表格內。
【提示】在小型應用程序中,模型經常是一個概念上的分離而不是一個物理概念。例如,如果應用程序僅讀取一個數據集并且要把它發送到視圖中,那么應用程序就不必專門創建一個物理模型層和相關聯的類。在這種情況下,數據就直接承擔了一個模型對象的角色。
(二)視圖。視圖是負責顯示應用程序的用戶接口(UI)的組件。典型情況下,這個UI是基于模型數據創建的。一個典型的示例就是一個產品表格的編輯視圖。在此視圖中,可以基于一個產品對象的當前狀態顯示文本框、下拉列表框和復選框等控件。
(三)控制器。控制器組件的作用是負責處理用戶交互,操作模型,并且最終選擇一個要顯示UI的視圖并生成之。在一個MVC應用程序中,視圖僅僅負責顯示信息,而由控制器負責處理和響應用戶輸入與交互。例如,由控制器來處理查詢字符串值,并且把這些值傳遞到模型,然后在模型中使用該值進行數據庫查詢。
MVC模式在幫助你把應用程序的不同方面(輸入邏輯,業務邏輯和UI邏輯)分離開來的同時,提供了這些元素之間的松耦合。MVC模式要求每一種不同的邏輯應該存在于應用程序中的特定位置。例如,UI邏輯隸屬于視圖,而輸入邏輯隸屬于控制器,業務邏輯則隸屬于模型。這種分離有助于你在構建一個應用程序管理復雜性,因為它能夠使你在某一時刻僅專注于實現的一個方面。例如,你可以專注于視圖而不去關心業務邏輯。
除了管理復雜性外,較于測試一個傳統型ASP.NET Web應用程序,基于MVC模式進行開發使得測試應用程序更加容易。例如,在一個傳統型ASP.NET Web應用程序中,單個的類既用于顯示輸出也用于響應用戶輸入。因此,為傳統型ASP.NET應用程序編寫自動化測試可能非常復雜,因為為了測試單個頁面,你必須實例化頁面類,它所有的子控件以及應用程序中的其他依賴類。總之,你需要實例化大量的類才能夠運行該頁面,所以這種情況下要比針對應用程序的單個部件編寫測試困難得多。于是,針對傳統型ASP.NET應用程序的測試很可能比實現一個使用MVC框架開發的應用程序的測試要復雜和艱難得多。而且,一個傳統型ASP.NET應用程序在測試時還需要使用一個Web服務器。相比之下,MVC框架把組件分離開來并且大量地使用接口,這使得有可能獨立于框架的其他部分而較容易地單獨測試單個組件。
此外,一個MVC應用程序的三個主要組件之間的松耦合特征還推動了平行開發。例如,一名開發人員可以開發視圖,而另一名開發人員則在開發控制器邏輯,第三名程序員則可以專注于模型部分的業務邏輯的開發。
基于MVC框架Web應用程序的優點
歸納來看,ASP.NET MVC框架主要提供了下列優點:
通過把一個應用程序分離成相互獨立的模型、視圖和控制器三部分而進一步提高了應用程序復雜性的管理。
不再使用視圖狀態或基于服務器的表單技術。這使得MVC框架特別有利于想全面控制一個應用程序的行為的開發人員。
使用一種前端控制器(Front Controller)模式并通過單一的控制器來處理Web應用程序請求。這一特征使你有可能設計出一個支持極其豐富的路由基礎結構的應用程序。有關于前端控制器的更多的信息,請參考http://go.microsoft.com/fwlink/?LinkId=106357。
提供對于測試驅動開發(TDD)的大力支持。
基于Web表單Web應用程序的優點
傳統型基于Web表單的框架能夠提供下列優點:
支持事件模型。此模型能夠保留HTTP傳輸過程中的狀態,而這十分有利于在線業務式Web應用程序的開發。基于Web表單的應用程序提供大量的事件,所有這些事件都得到數以百計的服務器控件的支持。
使用一種頁面控制器(Page Controller)模式,此模式能夠把許多功能添加到單個的頁面。有關于頁面控制器的更多的信息,請參考http://msdn.microsoft.com/zh-cn/library/ms978764.aspx。
使用視圖狀態或基于服務器的表單,這使得狀態信息管理更加容易。
ASP.NET MVC框架特征
概括來看,ASP.NET MVC框架大致提供了下列重要特征:
實現應用程序基本任務(輸入邏輯,業務邏輯和UI邏輯)的分離,支持測試及測試驅動開發(TDD)。MVC框架中所有的核心契約都是基于接口的,因此十分利于使用mock對象(這是一些模擬應用程序中實際對象的模擬對象)測試工程。你可以對應用程序進行單元測試而不必在真正的ASP.NET進程中運行控制器,這加快了單元測試的速度和靈活性。你可以使用與.NET框架相兼容的任何單元測試框架測試你的工程。
提供了一個可擴展的和可插接的框架。ASP.NET MVC框架組件的設計支持用戶十分容易地對它們進行替換或定制。你可以設計并加入你自己的視圖引擎,URL路由策略,行為方法參數串行化,以及其它組件。ASP.NET MVC框架還支持使用現有依賴性注入(即“Dependency Injection”,簡稱“DI”)和控制反轉(IOC)容器模型。其中,DI允許你把對象注入到一個類中,而不是依賴于類去創建對象本身。而IOC指定,如果一個對象要求使用另一個對象,那么第一個對象應該從一個外部源(例如一個配置文件)得到第二個對象。這一支持極有利于對工程的測試。
實現了一個強有力的URL映射組件,支持你在應用程序中構建易于理解的可搜索的URL(而不是像諸多Web應用URL中的那種極其復雜的表達方式)。如今,URL中不必包括文件擴展名,而且其設計還支持URL命名模式。因此,這種模式有利于搜索引擎優化(SEO)和REST(表述性狀態轉移)尋址。
支持在現有ASP.NET頁面(.aspx文件)、用戶控件(.ascx文件)以及母版頁面(.master文件)標記文件中把標記用作視圖模板。你可以在使用ASP.NET MVC框架的過程中繼續使用現有ASP.NET特征,例如嵌套的母版頁面,內聯表達式(<%=%>),聲明性服務器控件,模板,數據綁定,本地化,等等。
支持現有ASP.NET特征。ASP.NET MVC框架支持你使用例如表單和Windows認證,URL授權,會員和角色,輸出緩沖和數據緩沖,會話和配置狀態管理,健康監視,配置系統,提供者架構,以及其它ASP.NET特征。
URL映射
典型情況下,在一個ASP.NET網站中,URL會被映射到存儲在磁盤上的文件(主要是指.aspx文件)。這些.aspx文件中將包括針對客戶端發出的請求要處理的代碼或標記。
ASP.NET MVC框架以不同于ASP.NET網站應用程序的方式把URL映射到服務器代碼。MVC框架不是把URL映射到ASP.NET頁面或HTTP處理器程序,而是直接把URL映射到特定的控制器類。然后,由控制器類負責處理發來的請求,例如用戶輸入與交互,以及基于用戶輸入執行適當的應用程序及數據邏輯。典型地,一個控制器類調用一個單獨的視圖組件來生成相應的HTML輸出作為對客戶端發出請求的響應。
在ASP.NET MVC框架中,模型、視圖和控制器組件被分離開來。典型地,模型組件主要負責維護數據庫中持久數據的狀態,而視圖組件則由控制器進行選擇并最終在客戶端生成相應的UI。默認情況下,ASP.NET MVC框架使用現有ASP.NET頁面(.aspx),母版頁面(.master)和用戶控件(.ascx)類型作為在瀏覽器端的輸出形式。控制器組件將定位控制器中適當的行為方法,取得用作行為方法的參數值,處理執行行為期間所有可能發生的錯誤,并生成要求的視圖。每一組組件各自存在于一個MVC Web應用程序工程的一個單獨的文件夾下。
通過提供了一個URL映射引擎,ASP.NET MVC框架在把映射URL到控制器類方面提供了相當的靈活性。你可以使用這種映射引擎來定義路由規則,然后ASP.NET MVC框架使用這些路由規則來計算發來的URL請求并選擇要執行的控制器。你還可以讓路由引擎自動地分析URL中定義的變量并且使ASP.NET MVC框架把這些內容以參數方式傳遞給控制器。
MVC框架與頁面回寄
ASP.NET MVC框架并不使用傳統的ASP.NET回寄模型來實現與服務器端的交互。代之的是,所有的終端用戶交互都被路由到一個控制器類。這有利于保持UI邏輯和業務邏輯的分離,并且有助于測試目的。結果是,ASP.NET視圖狀態和ASP.NET頁面生命周期事件并沒有與基于MVC的視圖集成到一起。
本文節選自朱先忠的博客:《ASP.NET 3.5 MVC框架深度解析》。
【編輯推薦】