ASP.NET MVC是微軟公司的一款WEB開發框架,整合了“模型-檢視-控制器”架構的高效與整潔,是敏捷開發最現代的思想與技術。它是傳統ASP.NET WebForm的一個完善的替代品。
1、當今的Web開發
1)REST(Representational State Transfer)已經成為應用程式在HTTP上互操作的主要體系架構,完全使SOAP失色。REST是根據表示真實世界實體的資源(URI)和表示在這些資源上可用的標準操作方法(HTTP方法)來描述一個應用程式。通過HTTP方法與資源地址的組合就可以對資源執行相應的操作,這種組合就是REST,執行這種操作的請求也稱為REST化的請求。(對於REST的理解個人還是不透徹,後面會對此概念進行補充)
當前的Web應用程式不只是提供HTML服務,通常也需要將XML或JSON資料提供給使用者,而WebForm很難支援。
2)整個軟體行業向著敏捷與測試驅動開發方向的發展,如單元測試工具(NUnit、xUnit)、模仿框架(Moq、Rhino、Mocks)、控制反轉容器(Ninject、AutoFac)、持續整合伺服器(CruiseControl、TeamCity)、物件關係對映器(NHibernate、Subsonic、EF、Dapper、Petapoco)、UI自動化工具的提供。(測試驅動開發TDD思想:首先描述想要得到的行為範例,稱為測試規範;然後進行軟體設計,這樣通過執行依附於這一實現的一套測試,來驗證應用程式的穩定性和正確性)
3)順應Web標準和REST化的趨勢。
2、ASP.NET WebForm的歷史與問題
ASP.NET WebForm的技術堆疊,如下圖所示:
此圖的含義是WebForm建立在ASP.NET之上,而ASP.NET又建立在.NET平臺之上,MVC框架所起的作用是替代WebForm。
WebForm的設計思想是,讓Web開發在感覺上與Windows Form開發相同。開發者不再需要以一系列獨立的HTTP請求與響應進行工作,可以認為它是一種狀態化的UI,人們可以忘記WEB及其無狀態本質,轉而用一種“拖--放”式設計器來建立UI,並設想所有事情都發生在伺服器上。
隨著時間的推移,WebForm在實際專案中出現了一些缺陷:
1)檢視狀態重負:維護狀態的實際機制,也就是ViewState(檢視狀態)導致在客戶端與伺服器之間傳輸大塊資料(達到幾百KB),而且來回於每次請求之間,導致響應時間很慢,增加了伺服器的頻寬需求;
2)頁面生命週期:連線客戶端與伺服器端事件處理器程式碼的機制很複雜,對於應用程式執行期間很難進行維護;
3)關注分離的錯誤理念:本身將程式碼從HTML提取出來,放到後臺程式碼類中進行處理是很一種很好的方式,但是一些開發者在後臺程式碼中將表現程式碼與應用業務邏輯混合在一起,導致最後程式碼混亂並難以維護;
4)HTML的受限控制:伺服器控制元件將自己渲染成HTML,但並不是所希望看到的HTML,在ASP.NET 4之前,並不能很好的使用CSS。同時會生成不可預知或複雜的ID,這樣JavaScript就很難進行訪問。
5)有缺陷的抽象:WebForm試圖儘量隱去HTML和HTTP(這是通過WebForm的抽象層實現的)。當你實現自己的方法時,需要放棄這種抽象,迫使採取回發事件機制的逆向工程。所以這種抽象對於開發者而言就構成一個極大的障礙和挑戰;
6)低可測試性:WebForm的這種緊耦合體系結構並不適合於單元測試,對於整合測試也很具有挑戰性;
3、ASP.NET MVC的特點
1)ASP.NET MVC框架實現了MVC模式(MVC模式在1978年就已經提出來了),由於ASP.NET MVC極大的改善了關注分離,所以特別適用於Web應用程式。因為與MVC應用程式的互動遵循著使用者動作與檢視更替的自然週期,在這個週期中,假設檢視是無狀態的。這與支撐Web應用程式的HTTP請求與響應方式非常吻合。
2)可擴充套件性,MVC框架被構建成一系列獨立的元件,如路由系統、檢視引擎、控制器工廠,你可以很容易地用一個自己的不同實現來替換這些元件,通常有三種選擇:
a、使用元件現行的預設實現,此種可以滿足大多數應用程式;
b、派生預設實現的一個子類,以調整其行為;
c、用介面或者抽象基類的一個新的實現來完全替換該元件;
3)HTML和HTTP上的嚴密控制,ASP.NET MVC會產生整潔與標準相容的標記,其內建的HTML輔助器方法,可以產生與標準相容的輸出。ASP.NET MVC生成的頁面不包含任何ViewState資料,這種對頻寬的節約,可以極大的改善使用者的體驗,並且可以對瀏覽器與伺服器之間傳遞的請求加以控制。
4)可測試性,ASP.NET MVC應用程式不僅可以進行單元測試,還可以與UI自動化測試工具良好協作。
5)強大的路由系統,採用REST風格的路由方案,有如下好處:
a、搜尋引擎對URL中找到的關鍵詞有明顯的權重,對同樣的關鍵詞的搜尋,極有可能會轉向一個較為簡單的URL地址;
b、許多Web使用者現在對URL有足夠的領悟,並且願意在瀏覽器的位址列目中輸入URL地址;
c、當理解URL地址的結構後,人們才會更有可能連結它,並向其他人共享;
d、此種URL結構並不會將應用程式的技術細節、資料夾、檔名稱等結構暴露給網際網路。對於底層實現可以自由修改,而不會破壞連結;
6)建立在ASP.NET平臺之上,一方面ASP.NET MVC是基於.NET平臺的,因此可以靈活的使用任何.NET語言來編寫程式碼,可以使用廣泛的.NET類庫和大量的第三方.NET類庫體系;另一方面,已經形成的ASP.NET平臺特性,如認證、成員、角色、配置檔案、國際化等可以減少開發和維護Web應用程式所需要的程式碼量。
7)ASP.NET MVC是針對.NET 4.X而建立的,因此它的API可以充分利用當前語言和執行時的創新,如await關鍵字、擴充套件方法、lambda表示式、匿名、動態型別、LINQ。
8)ASP.NET MVC是開源的。
4、ASP.NET MVC與ASP.NET WebForm的比較
首先需要說明的是,雖然ASP.NET MVC相對於ASP.NET WebForm來說有一些優勢,但這並不意味著前者要替代後者,也不意味著後者要消亡。
- WebForm的觀念是,UI應該是狀態化的,其結果是,在HTTP和HTML之上新增一個抽象層,用檢視狀態(ViewState)和回發(Postback)來建立狀態化的效果。這是一種“拖放”式Windows Form風格的開發。
- MVC採納了HTTP真正無狀態的本質。MVC框架要求使用者理解Web應用程式實際的工作方式,在理解的前提下,進行維護和擴充套件,提供一種功能強大、簡單的、整潔的、現代的方法來編寫Web應用程式,擺脫複雜的限制。
- 所以說,開發小型的,企業內部型應用程式,可以考慮採用WebForm的方式來實現,但更多的時候,開發網際網路應用程式或者大型的應用程式時,MVC無論從效率、相容性、維護性都是一種更好的選擇。
參考資料:《精通ASP.NET MVC X》