淺談MVC框架的優(yōu)點(diǎn)(翻譯)
傳統(tǒng)的ASP.NET Web Forms是一個(gè)非常好的主意,但現(xiàn)實(shí)需求非常復(fù)雜。隨著時(shí)間的推移,現(xiàn)實(shí)世界的項(xiàng)目暴露出Web Forms的一些不足之處:
“沉重的”視圖狀態(tài):現(xiàn)實(shí)中在http請(qǐng)求之間維持狀態(tài)(術(shù)語(yǔ)叫視圖狀態(tài))導(dǎo)致了服務(wù)端和客戶端巨大的數(shù)據(jù)塊來(lái)回傳遞。典型情況下這個(gè)數(shù)據(jù)塊會(huì)大到數(shù)百K字節(jié),而且這個(gè)數(shù)據(jù)塊會(huì)在每次請(qǐng)求時(shí)來(lái)回傳輸,導(dǎo)致網(wǎng)站訪問(wèn)者訪問(wèn)速度下降,同時(shí)增加了服務(wù)器的帶寬負(fù)擔(dān)。
頁(yè)面生存周期:作為頁(yè)面生存周期的一部分,連接客戶端事件和服務(wù)端事件處理代碼的機(jī)制,有時(shí)會(huì)非常復(fù)雜和微妙。很少有開(kāi)發(fā)者能夠在運(yùn)行時(shí)成功操縱控件的層次結(jié)構(gòu)而不發(fā)生視圖狀態(tài)錯(cuò)誤,有時(shí)還會(huì)發(fā)現(xiàn)一些事件處理代碼在運(yùn)行神秘的失敗了。
對(duì)HTML控制有限:服務(wù)端控件在客戶端將自身轉(zhuǎn)化為HTML標(biāo)記,但往往并不是你想要的。在ASP.NET 4.0以前版本中,它的HTML輸出通常并不符合WEB標(biāo)準(zhǔn),和層疊樣式表(CSS)也沒(méi)有良好的結(jié)合,而且服務(wù)端控件自動(dòng)創(chuàng)建不可預(yù)知的、復(fù)雜的標(biāo)記ID值,導(dǎo)致Javascript難以訪問(wèn)。這些問(wèn)題在在ASP.NET 4.0里有所改善,但要獲取你期望的HTML標(biāo)記可能依然比較棘手。
有問(wèn)題的抽象:Web Forms試圖盡可能隱藏HTML和HTTP的實(shí)現(xiàn)細(xì)節(jié)。當(dāng)你想要實(shí)現(xiàn)自定義的行為時(shí),你必須頻繁地從這種抽象里跳出來(lái),強(qiáng)制你對(duì)回發(fā)事件機(jī)制實(shí)施進(jìn)行逆向工程,采取一些繁瑣的方法(obtuse acts)生成你想要的HTML文本。這些抽象甚至?xí)顦O富經(jīng)驗(yàn)的WEB開(kāi)發(fā)者感到令人沮喪的挫折。
低級(jí)的可測(cè)試性:ASP.NET的設(shè)計(jì)者壓根沒(méi)有把自動(dòng)測(cè)試作為這個(gè)軟件開(kāi)發(fā)平臺(tái)的必要工具。這并不奇怪,他們?cè)O(shè)計(jì)的緊密耦合的體系結(jié)構(gòu)根本不合適進(jìn)行單元測(cè)試,集成測(cè)試也是個(gè)問(wèn)題。
ASP.NET在不斷發(fā)展。2.0版增加了一套標(biāo)準(zhǔn)應(yīng)用程序組件集,可以減少你需要自己輸入的代碼量。2007年發(fā)布的AJAX版本是微軟對(duì)當(dāng)時(shí)Web 2.0/AJAX瘋狂流行的響應(yīng),它支持富客戶端交互。最近發(fā)布的ASP.NET 4.0版,可以產(chǎn)生大部分可以預(yù)見(jiàn)的符合標(biāo)準(zhǔn)的HTML標(biāo)記,但許多其固有的局限性依然存在。
ASP.NET MVC的主要優(yōu)勢(shì)
ASP.NET在商業(yè)上取得了巨大成功,但正如前所述,其它的WEB開(kāi)發(fā)平臺(tái)也在不斷向前發(fā)展。盡管微軟一直在努力把緾繞在WEB Forms上的“蜘蛛網(wǎng)”清除掉,但其內(nèi)在的設(shè)計(jì)理念已經(jīng)落伍了。
2007年10月份,在美國(guó)德克薩斯州奧斯丁市召開(kāi)的第一屆ALT.NET會(huì)議上,微軟公司副總裁Scott Guthrie發(fā)布并演示了一個(gè)基于ASP.NET的嶄新的MVC WEB開(kāi)發(fā)平臺(tái),明確的被設(shè)計(jì)為針對(duì)類似Rails這樣的技術(shù)的直接響應(yīng),也是對(duì)業(yè)界關(guān)于Web Forms的批評(píng)的回應(yīng)。本章的余下部分描述這個(gè)新的平臺(tái)如何解決Web Forms的種種不足,并令A(yù)SP.NET重返頂峰。
(一) MVC體系結(jié)構(gòu)
把MVC構(gòu)建模式和ASP.NET MVC框架之間的區(qū)別搞清楚是十分重要的。MVC模式并不是新生事物-這要追溯到1978年施樂(lè)公司帕洛阿爾托研究中心的Smalltalk項(xiàng)目-之所以在今天的WEB開(kāi)發(fā)領(lǐng)域廣受歡迎,有以下原因:
MVC應(yīng)用程序的用戶交互符合自然周期:用戶執(zhí)行一個(gè)動(dòng)作,作為響應(yīng),應(yīng)用程序改變它的數(shù)據(jù)模型,并向用戶提供一個(gè)更新了的視圖。應(yīng)用程序就一直這樣循環(huán)的運(yùn)行。這種模式非常適合WEB應(yīng)用程序傳遞
一連串的HTTP請(qǐng)求和響應(yīng)。
WEB應(yīng)用程序必然要涉及若干不同的技術(shù)領(lǐng)域(數(shù)據(jù)庫(kù),HTML,可執(zhí)行代碼),通常這些技術(shù)都分布在不同層面。而MVC的概念很自然的就和這些技術(shù)的組合模式對(duì)應(yīng)起來(lái)了。
ASP.NET MVC框架實(shí)現(xiàn)了MVC模式,而且這樣做,有利于更好分離關(guān)注。實(shí)際上,ASP.NET MVC實(shí)現(xiàn)了一個(gè)特別為WEB應(yīng)用開(kāi)發(fā)定制的MVC模式。在第4章你將會(huì)了解這個(gè)體系的更多的理論,并親身體驗(yàn)。
通過(guò)包含和改進(jìn)MVC模式,ASP.NET MVC框架相對(duì)于Ruby on Rails這樣的框架具備了強(qiáng)大的競(jìng)爭(zhēng)力,同時(shí)也將MVC模式引入到主流的.NET領(lǐng)域。通過(guò)使用其它平臺(tái)的開(kāi)發(fā)者提供的對(duì)ASP.NET MVC的體驗(yàn)評(píng)估和實(shí)際應(yīng)用中反饋,ASP.NET MVC在許多方面甚至已經(jīng)超越了Rails。
(二) 可擴(kuò)展性
你的桌面型電腦都是由一些相互獨(dú)立的部分組成,它們之間通過(guò)標(biāo)準(zhǔn)的公開(kāi)的文檔化的接口相互聯(lián)系。你可以很輕松的把你的顯卡和硬盤(pán)換成另一個(gè)制造商生產(chǎn)的產(chǎn)品,并確信它們可以插進(jìn)相應(yīng)的槽位并正常工作。MVC框架的原理和PC一樣也是構(gòu)建在一系列相互獨(dú)立的組件的基礎(chǔ)之上-如一個(gè)可信的.NET接口或繼承抽象基類的用戶類-這樣你就可以輕而易舉的用你自己的實(shí)現(xiàn)替換這些組件,諸如路由系統(tǒng),視圖引擎,控制器工廠等等。
ASP.NET MVC設(shè)計(jì)者對(duì)如何使用MVC框架的每個(gè)組件向你提供了三個(gè)選擇:
使用默認(rèn)組件實(shí)現(xiàn)(對(duì)于大部分應(yīng)用來(lái)說(shuō)已經(jīng)足夠了)
從默認(rèn)實(shí)現(xiàn)繼承實(shí)現(xiàn)一個(gè)子類,以對(duì)某些行為進(jìn)行微調(diào)
使用新的接口或抽象基類實(shí)現(xiàn)替換這些組件
這些看起來(lái)有點(diǎn)像ASP.NET 2.0中的供給者模式(provider model),但它更進(jìn)了一步-完全進(jìn)入了MVC框架的核心。從第10章起,你將會(huì)了解到各種各樣的組件,并且知道為什么要調(diào)整或替換它們。
(三) 對(duì)HTML代碼和HTTP的嚴(yán)密控制力(Tight Control over HTML and HTTP)
ASP.NET MVC知道產(chǎn)生整潔、符合標(biāo)準(zhǔn)的標(biāo)記的重要。它內(nèi)置的HTML helper方法的輸出完全符合標(biāo)準(zhǔn),但同Web Forms相比較其更多的重要變化體現(xiàn)在其設(shè)計(jì)哲學(xué)上。以往你對(duì)Web Forms自動(dòng)生成的一大堆令人作嘔的封裝的HTML標(biāo)記只有很小的控制權(quán),作為替代,MVC框架鼓勵(lì)你使用CSS設(shè)計(jì)簡(jiǎn)潔、優(yōu)雅的標(biāo)記。
當(dāng)然,如果你想在你的頁(yè)面擺上一些現(xiàn)成的復(fù)合UI元素的小玩意,像日歷或級(jí)聯(lián)菜單,ASP.NET MVC中的“無(wú)特殊要求”的標(biāo)記方法讓你可以輕易的使用最好的UI庫(kù),比如JQuery或雅虎的YUI庫(kù)。微軟已經(jīng)把JQuery內(nèi)置為ASP.NET MVC默認(rèn)項(xiàng)目模板的一部分,JavaScript程序員會(huì)對(duì)ASP.NET MVC和當(dāng)前流行的JQuery庫(kù)結(jié)合如此緊密感到欣慰,甚至在微軟自己的內(nèi)容分發(fā)網(wǎng)絡(luò)(CDN)服務(wù)器上你都可以直接引用Jquery.js文件。我們將在第20章涉及到JQuery。
ASP.NET MVC生成的頁(yè)面不包含任何視圖狀態(tài)數(shù)據(jù),因此它們比典型的ASP.NET Web Forms頁(yè)面會(huì)小數(shù)百K。盡管今天的寬帶連接已經(jīng)非常快了,但這種帶寬的節(jié)約依然會(huì)給最終用戶帶來(lái)巨大的體驗(yàn)改善。
和Ruby on Rails一樣,ASP.NET MVC和HTTP合作和諧。你對(duì)往返于瀏覽器和服務(wù)器之間請(qǐng)求擁有完整的控制權(quán),這樣你就按你的喜好可以微調(diào)你的用戶體驗(yàn)。AJAX現(xiàn)在實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,而且沒(méi)有任何影響客戶端狀態(tài)的自動(dòng)回發(fā)。關(guān)注Web開(kāi)發(fā)領(lǐng)域的任何開(kāi)發(fā)者幾乎肯定會(huì)發(fā)現(xiàn),ASP.NET MVC會(huì)極大減少工作量,在同樣的時(shí)間內(nèi)完成的任務(wù)會(huì)更加令人滿意。
(四) 易測(cè)試性
MVC使你在應(yīng)用程序的可維護(hù)和可測(cè)試方面邁出了一大步,因?yàn)槟憧梢宰匀坏母鶕?jù)程序要實(shí)現(xiàn)的不同功能將其分離成許多不同的、相互獨(dú)立的軟件塊。然而,ASP.NET MVC的設(shè)計(jì)師們并不滿足于到底就止步了。為了支持單元測(cè)試,他們?cè)诳蚣苤幸肓嗣嫦蚪M件設(shè)計(jì)的概念,并確保每個(gè)分離的代碼塊都以滿足單元測(cè)試和模擬工具的需要的形式構(gòu)建。
出于為開(kāi)發(fā)者考慮的角度,他們還在Visual Studio向?qū)е性黾恿藙?chuàng)建單元測(cè)試向?qū)?,它可以使用許多開(kāi)源的單元測(cè)試工具,如NUnit和xUnit,甚至微軟自己的MSTest。即使你以前從來(lái)沒(méi)有寫(xiě)過(guò)單元測(cè)試代碼,你也會(huì)有一個(gè)良好的開(kāi)始。
本書(shū)中,你會(huì)看許多為ASP.NET MVC控制器(controller)和行為(action)編寫(xiě)的簡(jiǎn)潔、簡(jiǎn)單的單元測(cè)試示例,這些示例會(huì)使用各種測(cè)試和模擬策略來(lái)冒充框架組件的實(shí)現(xiàn),以確定實(shí)際運(yùn)行中可能出現(xiàn)的任何情況。
易測(cè)試性不只是體現(xiàn)在單元測(cè)試中,ASP.NET MVC應(yīng)用程序和UI自動(dòng)化測(cè)試工具之間工作也非常好。你可以模擬用戶交互的情景編寫(xiě)測(cè)試腳本,再不用去猜測(cè)HTML元素的結(jié)構(gòu),使用的CSS類,或者框架將要生成的ID,也用不著擔(dān)心頁(yè)面的結(jié)構(gòu)會(huì)出現(xiàn)莫名其妙的變化。
(五) 強(qiáng)大的路由系統(tǒng)
URL的風(fēng)格伴隨著Web應(yīng)用技術(shù)的發(fā)展也在不斷發(fā)展。像下面的URL:
/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742
將會(huì)逐漸稀少,它將被一種簡(jiǎn)單的、整潔的格式所代替,就像下面的這個(gè):
/to-rent/chicago/2303-silver-street
之所以關(guān)注URL的結(jié)構(gòu)問(wèn)題,有以下幾個(gè)很好的原因:第一,搜索引擎給在URL中搜索關(guān)鍵字分配了很大的權(quán)重。搜索“芝加哥的租金”會(huì)更容易匹配上面那個(gè)簡(jiǎn)單的URL。第二,現(xiàn)在許多網(wǎng)絡(luò)用戶的理解能力足夠搞明白一個(gè)URL的意思,而且他們很欣賞在瀏覽器地址欄輸入地址時(shí)的智能導(dǎo)航選項(xiàng)。第三,當(dāng)人們理解了一個(gè)URL的結(jié)構(gòu),他們更有可能去鏈接它,把它和朋友共享,甚至可以通過(guò)電話大聲的讀出來(lái)。第四,它不會(huì)把你的應(yīng)用程序的技術(shù)細(xì)節(jié),目錄,文件名結(jié)構(gòu)公開(kāi)到整個(gè)互聯(lián)網(wǎng)上,因此,你可以自由的改變底層的實(shí)現(xiàn)而不會(huì)影響到你已經(jīng)擁有的連接。
早期的框架難以實(shí)現(xiàn)精準(zhǔn)的URL,不過(guò)ASP.NET MVC默認(rèn)使用System.Web.Routing命名空間很容易提供精準(zhǔn)的URL。它可以讓你控制你的URL的樣式,并將其和你的應(yīng)用相關(guān)聯(lián),為你提供創(chuàng)造一個(gè)有意義的、對(duì)用戶有用的地址樣式的自由,不需要遵守預(yù)定義的模式。另外,只要你愿意,你完全可以容易的定義時(shí)髦的REST風(fēng)格的URL樣式。你會(huì)第11章看到一個(gè)詳細(xì)的路由方案和關(guān)于URL的最佳練習(xí)。
(六) 構(gòu)建于ASP.NET平臺(tái)最好的部分之上
微軟現(xiàn)有的ASP.NET平臺(tái)已經(jīng)為開(kāi)發(fā)實(shí)用和高效的web應(yīng)用程序提供了一整套成熟的、久經(jīng)考驗(yàn)的組件和工具集。
首先也是最明顯的地方,因?yàn)锳SP.NET MVC構(gòu)建在.NET平臺(tái)之上,所以用戶可以靈活的使用任意.NET語(yǔ)言編寫(xiě)代碼和訪問(wèn)相同API功能-不光是MVC里面的,也包括大量的系統(tǒng).NET類庫(kù)和浩瀚的第三方.NET庫(kù)。
其次,現(xiàn)有的ASP.NET平臺(tái)的一些功能-比如母版頁(yè),表單驗(yàn)證,成員資格,角色,profiles,還有國(guó)際化-能夠減少你需要開(kāi)發(fā)和維護(hù)任意應(yīng)用程序的代碼量,這些功能在MVC框架中同樣有效,因?yàn)樗緛?lái)就是一個(gè)杰出的Web Forms項(xiàng)目。你可以在ASP.NET MVC的項(xiàng)目中繼續(xù)使用一部分Web Forms內(nèi)置的服務(wù)器控件,以及你在早期的ASP.NET項(xiàng)目中創(chuàng)建的自定義控件。(不過(guò)不能再依賴Web Forms中的特有概念,比如視圖狀態(tài))
開(kāi)發(fā)和布署是交替進(jìn)行的。ASP.NET不僅和Visual Studio緊密結(jié)合在一起,它也作為一種原生的web編程技術(shù)為Windows XP,Vista,7和服務(wù)器操作系統(tǒng)中安裝的Internet信息服務(wù)(IIS)所支持。IIS7發(fā)布后,將.NET托管代碼它的請(qǐng)求處理管道的原生部分,為其提供第一流的支持,這也是ASP.NET的特殊待遇。因?yàn)镸VC應(yīng)用基于ASP.NET平臺(tái)核心,因此它也會(huì)同樣享受這些待遇。第23章我們會(huì)詳細(xì)說(shuō)明如何在Windows服務(wù)器上的IIS中部署MVC應(yīng)用程序。
(六) 現(xiàn)代化的API
自微軟2002年發(fā)布 .NET平臺(tái)以來(lái),它一直在持續(xù)的發(fā)展,支持甚至是定義了現(xiàn)代編程技術(shù)頂級(jí)水準(zhǔn)。
ASP.NET MVC是專為.NET 4.0打造的,所以它的API可以使用最新的編程語(yǔ)言和運(yùn)行時(shí)創(chuàng)新的所有益處,包含擴(kuò)展方法,lambda表達(dá)式,匿名和動(dòng)態(tài)類型,語(yǔ)言集成查詢(LINQ)。許多MVC框架的API方法和編碼模式盡可能的比早期平臺(tái)整潔,更富表現(xiàn)力。
(七) ASP.NET MVC是開(kāi)源的
和微軟先前的平臺(tái)不同,ASP.NET MVC的原始代碼你可以隨意下載,甚至可以對(duì)其進(jìn)行修改,重新編譯為你自己的版本。當(dāng)你的調(diào)試足跡深入到一個(gè)系統(tǒng)組件內(nèi)部,想對(duì)它的代碼進(jìn)行步進(jìn)(甚至閱讀原作者的注釋)時(shí),代碼開(kāi)源是非常有用的。另外,如果你想構(gòu)建一個(gè)更高級(jí)的組件,看看可能會(huì)發(fā)生什么,或者觀察內(nèi)置組件是如何工作的,這點(diǎn)也非常有幫助。
同時(shí),如果你不喜歡某些工作的實(shí)現(xiàn)方式,或者你發(fā)現(xiàn)了一個(gè)錯(cuò)誤,又或者你想訪問(wèn)一些其它方式無(wú)法訪問(wèn)的東西,開(kāi)源好處是非常強(qiáng)大的。因?yàn)槟阕约壕涂梢院?jiǎn)單的改變它。
不過(guò),如果將來(lái)有一天你將你的框架升級(jí)到新版本,你還要重復(fù)你所作的改變?cè)僦匦聭?yīng)用它們。ASP.NET MVC是按照微軟公共許可(Ms-PL,http://www.opensource.org/licenses/ms-pl.html)發(fā)布的,這是一個(gè)經(jīng)過(guò)開(kāi)源促進(jìn)組織批準(zhǔn)的開(kāi)源許可。也就是說(shuō)你能夠修改源代碼并部署它,甚至把它作為一個(gè)衍生項(xiàng)目向公眾發(fā)布。然而,微軟在其官方版本上不接受任何補(bǔ)丁,現(xiàn)階段,微軟只維護(hù)其產(chǎn)品開(kāi)發(fā)和質(zhì)量保證團(tuán)隊(duì)的負(fù)責(zé)的代碼,你可以從http://aspnt.codeplex.com/網(wǎng)站上下載MVC的源代碼。
相關(guān)文章
ASP.NET Core MVC 過(guò)濾器的使用方法介紹
本篇文章主要介紹了ASP.NET Core MVC 過(guò)濾器的使用方法介紹,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-09-09C#和asp.net中鏈接數(shù)據(jù)庫(kù)中參數(shù)的幾種傳遞方法實(shí)例代碼
這篇文章介紹了C#和asp.net中鏈接數(shù)據(jù)庫(kù)中參數(shù)的幾種傳遞方法實(shí)例代碼,有需要的朋友可以參考一下2013-10-10ASP.NET2.0:頁(yè)面中鏈入的CSS、js文件帶中文時(shí)需注意
ASP.NET2.0:頁(yè)面中鏈入的CSS、js文件帶中文時(shí)需注意...2006-09-09理解HttpHandler,并為所有*.jpg圖片生成一段文字于圖片上
HttpHandler就是最終相應(yīng)HTTP請(qǐng)求,生成HTTP響應(yīng)的處理器,他們的實(shí)例由asp.net運(yùn)行時(shí)創(chuàng)建,,并生存在asp.net的運(yùn)行時(shí)環(huán)境中,如果asp.net運(yùn)行時(shí)是處理請(qǐng)求的工廠,HttpHandler是處理請(qǐng)求的工人2012-03-03Extjs4.1.x 框架搭建 采用Application動(dòng)態(tài)按需加載MVC各模塊完美實(shí)現(xiàn)
中午的時(shí)候發(fā)了第一篇 Extjs4.1.x 框架搭建 采用Application動(dòng)態(tài)按需加載MVC各模塊,發(fā)現(xiàn)實(shí)現(xiàn)上還是有問(wèn)題,本文將提供詳細(xì)的完美方案2012-11-11WPF制作一個(gè)簡(jiǎn)單的倒計(jì)時(shí)器實(shí)例附源碼
既然早上沒(méi)事干,于是想到前些日子學(xué)院的某個(gè)老師讓大家給他找個(gè)什么倒計(jì)時(shí)的小軟件;何不寫(xiě)個(gè)玩玩~既然要寫(xiě),就用以前沒(méi)怎么搗鼓過(guò)的WPF寫(xiě)一個(gè)倒計(jì)時(shí)器,需要了解的朋友可以參考下2012-12-12asp.net使用ashx生成圖形驗(yàn)證碼的方法示例
這篇文章主要介紹了asp.net使用ashx生成圖形驗(yàn)證碼的方法,結(jié)合實(shí)例形式分析了asp.net生成圖形驗(yàn)證碼的步驟、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-07-07關(guān)于Net6?Xunit?集成測(cè)試的問(wèn)題
這篇文章主要介紹了Net6?Xunit?集成測(cè)試的相關(guān)知識(shí),下面我將Net6下沒(méi)有使用Startup以及NET6以前版本使用Startup的集成測(cè)試(單元測(cè)試?yán)淄┳鲆粋€(gè)梳理,需要的朋友可以參考下2022-05-05