Pro ASP.NET Core MVC 第6版 第一章

目錄 

第一章 ASP.NET Core MVC 的前世此生

 

 

 

ASP.NET Core MVC 是一個微軟公司開發的Web應用程序開發框架,它結合了MVC架構的高效性和簡潔性,敏捷開發的思想和技術和.NET 平臺的最好的部分。在本章,咱們將學習爲何微軟建立ASP.NET Core MVC, 看看他和他的前輩的比較以及和其餘相似框架的比較,最後,大概講一下ASP.NET core MVC裏面有什麼新東西,還有本書中包括哪些內容。javascript

 

瞭解ASP.NET Core MVC的歷史

 

 

 

最初的ASP.NET 誕生在2002年,那個時候,微軟想要保持傳統的桌面應用開發的霸主地位,又看出了因特網是一個潛在的威脅。下圖展現了當時的微軟的技術棧。html

 

 

 

1.1 ASP.NET Web Forms 技術棧java

 

ASP.NET Web Forms

微軟當時試圖使用Web Forms技術來隱藏超文本傳輸協議(HTTP),和與生俱來的無狀態性;並且在當時,HTML 對許多程序原來講時陌生的,因此WebForms 使用用戶控件在服務器端進行UI建模。 每一個控件在各個請求之間跟蹤着本身的狀態,在須要的時候渲染成HTML,還有自動鏈接客戶端事件(例如按鈕的單擊事件)以在服務器端執行響應代碼。實際上,Web Forms 是一個巨大的抽象層,用來在Web上實現事件驅動的圖形用戶界面。git

 

這個想法是基於想讓Web開發的感受就像開發桌面應用程序同樣的理念。開發人員能夠用有狀態UI來思考而且不須要一系列無關的HTTP請求和響應。 微軟能夠無痛地將Windows桌面開發大軍轉向新的Web開發的世界。程序員

 

ASP.NET Web Forms 出了什麼問題?

 

傳統的ASP.NET Web Forms 開發理論上來講是很好的,可是實際應用上看很是複雜。github

 

l 視圖狀態(View State) 過重: 在各個請求之間維護狀態的機制致使了大塊的數據在服務器端和客戶端來回傳遞。 在通常的Web應用裏,這些數據可能會達到數百KB。而且還要在每個請求裏跑一個來回,致使響應變慢,又增長了服務器的帶寬佔用。web

 

l 頁面的生命週期:將客戶端事件接到服務器端,事件處理器代碼的機制,是頁面生命週期的一部分,可是它很複雜,而且很脆弱,基本上沒有程序員可以在運行時操做控制器的層級關係而不產生視圖狀態錯誤。有一些事件處理程序會莫名其妙的失敗。數據庫

 

l 錯誤的關注分離: ASP.NET Web Forms 後端代碼模型,提供了一種將應用程序代碼從HTML標記裏分離成單獨的類那文件裏機制,就能夠分離邏輯和表現層,但實際上,開發人員更願意使用表現層代碼和邏輯代碼混合的方式。這最終致使應用程序的脆弱和不智能。編程

 

l HTML的有限的控制: 服務器端控件,將他們本身渲染成HTML,可是有一些HTML不是你想要的,在ASP.Net早期版本中不知足Web標準,或者不能很好地使用樣式表(CSS)。服務器控件也生成了帶有複雜ID的HTML標記,這樣的ID使得Javascript程序難以訪問。 這些問題雖然在最近的Web Forms版本中有所改善,可是也須要你是HTML編程專家才能使用它。windows

 

l 漏洞百出的抽象。 Web Forms 想要儘量地隱藏HTML 和HTTP。 當你試圖實現自定義的行爲時,你常常掉進了抽象的泥坑裏。強迫你逆向回發事件機制或執行遲鈍的方案才能使他產生想要的HTML。

 

l 不好的測試性。 Web Form的設計者們當初沒有意識到自動測試會變成軟件開發中相當重要的組成部分。 他們設計的緊耦合的架構不適合作單元測試。集成測試也不容易。

 

Web Forms 並不是都很差。微軟在標準兼容性方面和簡化開發流程方面作了不少努力,甚至從原始ASP.NET MVC 框架上提取了不少優秀的特性放到Web Forms裏。當你須要快速看到結果時,就像有時候你須要讓一個至關複雜的Web 應用程序在一個工做日內運行起來的話,使用Web Forms是至關合適的。可是除非你在開發的時候很是仔細,不然你會發現你所建立的應用程序會很是難以測試和維護。

 

原始的MVC 框架

 

2007年10月份,微軟宣佈了一個新的開發平臺,構建於現有的asp.net 平臺之上,算是對Web的各類批評和競爭對手如Ruby on Rails 直接的迴應。新平臺叫作ASP.NET MVC 框架。反映了Web應用開發的各類技術合併的趨勢,例如HTML和CSS 標準化,RESTful Web服務,有效的單元測試,還有開發人員應該擁抱無狀態(原文是有狀態,應是錯誤)的HTTP的天然性質的想法。

如今看來,支持原始的MVC框架的概念是天然的且顯而易見的,可是在2007年的時候,.NET web 開發的世界裏是缺少這些東西的。ASP.NET MVC 框架的推出使得微軟的web開發平臺從新走回了現代。

MVC框架也標誌了微軟態度的轉變,它本來是想要控制Web應用程序開發工具鏈的全部東西。微軟在MVC框架中採納了新的理念,如基於開源工具JQuery, 接受設計約定和從競爭對手平臺裏學到的最佳實踐,並對開發人員公開了MVC 框架的源代碼。

 

原始的MVC 框架出現了什麼問題?

在初創時期,微軟基於已有的ASP.NET 平臺上建立MVC框架是合理的,在其上面加了許多在開發過程當中對初學者有用的幫助,如初始頁等一些低級的功能,已經被ASP.NET開發人員所普遍認同和理解。

Web Forms平臺上嫁接出來的MVC 框架確定作了一些妥協。MVC框架的開發人員變得習慣於使用配置文件和必須將代碼作一些微調才能使應用程序得以運行。

 

隨着MVC框架變得愈來愈流行,微軟開始將一些核心特徵加入到Web Forms中。結果就使 Web Forms 變得奇怪了。由於原來是用於支持MVC框架的一些設計原理用來擴展Web Forms,他們之間必須相互融合的很好。同時,微軟開始擴展ASP.NET框架,以便建立Web Service和實時通訊,每個新的內容都加入了他們本身的配置和開發約定,每個東西都有他本身的優勢和奇異性,因此使得整個框架變得愈來愈支離破碎,也來越混亂。

 

理解ASP.NET Core

2015年,微軟宣佈了一個ASP.NET的新方向和一個新的MVC框架,最終產生了ASP.NET Core MVC, 本書的主要內容。

 

ASP.NET Core 是基於.NET Core創建的。 .NET Core 是一個.NET Framework的跨平臺版本,沒有專門針對於Windows的應用程序接口(API)的內容。Windows仍舊是一個佔據支配地位的操做系統,可是Web 應用程序正在增長份額,通常是承載於雲平臺上的小的簡單的容器裏。因爲轉向了支持跨平臺,微軟擴展了.NET 的觸角,使得ASP.NET Core應用在更普遍的環境中部署成爲了可能。 做爲一個獎勵,也可使得開發人員在Linux上和OSX/MacOS上可以建立ASP.NET Core web 應用程序。

 

ASP.NET Core 是一個全新的框架,他簡單,易於上手,對來自Web Form的程序員來講仍是很自由的。 並且由於他是基於.NET Core的,它支持在平臺和容器中進行Web應用程序的開發。

ASP.NET Core MVC 提供了在新的ASP.NET Core平臺上創建原始的ASP.NET MVC 框架的功能。 包括之前Web API提供的功能,包括了使用更天然的方式產生複合內容,也可讓關鍵的開發任務,如單元測試,變得更簡單更具備可預見性。

 

ASP.NET Core MVC 的主要優勢

下列章節簡要介紹了新的MVC平臺怎樣克服了原有的Web Forms和原始MVC框架帶來的問題,將ASP.NET從新帶回到技術前沿。

 

MVC 架構

ASP.NET Core MVC 遵循了model-view-controller(MVC) 模式,它規定了ASP.NET web 應用的結構形式和它包含的組件之間的交互方式。

區分MVC架構模式和ASP.NET core MVC實現是很重要的。 MVC模式不是新的,他能夠往回追溯到1978年的Xerox PARC 的Smalltalk 項目。可是,他在web應用中的使用變得愈來愈普遍,有如下緣由:

用戶與應用程序的交互遵循天然的生命週期:用戶使用一個action更改他的數據模型並將一個新的更新過的視圖交還給用戶。 這個循環一直重複下去。這對於web應用來講,處理一系列的HTTP請求和相應是很是方便的。

 

Web 應用使幾種技術(數據庫,HTML,可執行的代碼等)結合在一塊兒成爲必然,這些技術一般被分紅一系列的層。這些技術的結合的模式即映射成了MVC模式中的一些概念。

ASP.NET Core MVC 實現了MVC模式,而且相對於Web Form 應用來講,大大改進了分離程度。實際上,ASP.NET Core MVC 實現了許多MVC 模式,尤爲是適合於Web 應用的那些。你將會在第三章學到更多的關於這個架構的理論和實踐。

 

擴展性

ASP.NET Core和ASP.NET Core MVC 是由一系列獨立的具備良好定義特徵的,符合.Net 接口要求的或者創建在抽象基類基礎上的組件構成的。你能夠很容易地用你本身定義的組件替換掉任何一個關鍵組件。通常來講,ASP.NET Core MVC 爲每個組件提供三個選擇:

 

使用默認的實現(一般能夠知足大多數應用的要求)。

使用一個繼承自默認實現的類來對組件的行爲作輕微調整。

由知足接口規範的徹底由你自定義的新的實現類來替換默認的組件。

14章開始你將會學到各類不一樣的組件,並講解怎樣和爲何你想要作輕微的調整或徹底替換他們。

 

HTML和HTTP更全面的控制

ASP.NET Core MVC 可以產生出乾淨的、與標準兼容的標記,它內建的標記幫助器可以產生與標準兼容的輸出。可是與Web Forms 有着顯著的邏輯上的不一樣。ASP.NET Core MVC 鼓勵你構造簡單的、優雅的、具備CSS修飾的標記,而不是產生出一堆你幾乎不能控制的HTML代碼。

固然,若是你想使用現成的UI組件來製做複雜的UI元素,例如日期選擇器控件或層疊菜單,ASP.NET Core MVC無需特殊需求的方式可讓你很容易地使用那些最好的客戶端庫,例如jQuery,Angular,或Bootstrap CSS庫。ASP.NET Core MVC 會讓那些庫相處的很好,甚至微軟已經將他們做爲內置的標準模板的一部分。

 

ASP.NET Core MVC 與HTTP是很和諧的,你能夠控制在瀏覽器和服務器之間傳遞,因此,你能夠儘量使用你的經驗來作細微調節。Ajax 能夠變的很容易,創建一個web 服務來接受瀏覽器的HTTP請求是一個很簡單的過程,就像第20章描述的那樣。

 

可測試性

ASP.NET Core MVC架構給你提供了優秀的可維護性和可測試性,由於它能夠天然地將你所關心的部分分割成獨立的一塊塊。另外,ASP.Net Core 平臺的每一部分和ASP.NET Core MVC 框架能夠由於測試的目的徹底分離並替換,並可使用任何主流的開源測試框架來進行測試,例如咱們將在第七章介紹的xUnit。

在本書中你將看到如何爲ASP.NET Core MVC 控制器和動做(Action)編寫乾淨、簡單的單元測試,咱們將採用假的或虛構的框架組件實現來仿真任何應用場景,使用各類不一樣的測試和模擬的策略。便是你歷來沒有寫過單元測試,你也將有一個好的開始。

可測試性不只對單元測試來講是很重要的,ASP.NET Core MVC應用也具備良好的UI自動測試工具,你能夠編寫測試腳原本仿真用戶輸入,而不用去分析HTML元素的結構,CSS類,或框架生成的ID。你也無須擔憂程序結構在測試中無心地受到破壞。

 

強大的路由系統

隨着web應用程序技術的提升,統一的資源描述符(URLs)的風格也進化了。

例如像這樣的URL:

/App_v2/User/Page.aspx?action=show%20prop&prop_id=82742

已經大幅度減小了,被替換成更簡單的更乾淨的格式,像這樣:

/to-rent/chicago/2303-silver-street

有幾方面的緣由讓咱們來考慮URL的結構。 首先,搜索引擎會給出在URL中出現關鍵字的權重。 例如,對」rent in Chicago」 的搜索會獲得更多的更簡單的網址。其次,許多web用戶如今變得更有文化,已經能足夠理解經過輸入到瀏覽器的地址欄的URL並欣賞導航選項了。第三,一些人懂得URL的結構,他們將更願意去鏈接它,給朋友分享它,甚至能在電話裏經過大聲讀出的方式傳給對方。第四,他不會向公共互聯網曝露你的應用程序的技術細節,文件夾和文件名的結構。因此你能夠自由地改變底層的實現,而不會破壞你的全部連接。

 

早期的框架很難實現乾淨的URL,但ASP.NET Core MVC使用URL路由提供默認的乾淨URL。這使您能夠控制您的URL模式和您的應用程序之間的關係,爲您提供自由建立一個對用戶有用的無需符合預約義模式的有意義的URL模式。固然這意味着,若是你願意,能夠輕鬆地自定義一個現代REST風格的URL模式。

第15章和第16章你將學到更多關於URL路由的內容。

 

現代的API

微軟的.NET 平臺隨着每一次主版本的發行而進化,支持甚至引領着現代編程的當前技術水平。ASP.NET Core MVC 是爲.NET core創造的,所以它的API 能夠利用最新的語言和運行時特性,這些新東西已經廣爲程序員所熟悉,包括await關鍵字,擴展方法,Lambda表達式,匿名和動態類型,集成語言查詢(LINQ)等。

許多ASP.NET Core MVC API 方法和代碼模式遵循比早期版本更乾淨,更具表達力的原則。 可是若是你沒有了解最新的C#語音特性,別擔憂,咱們將在第四章提供一個最重要的C#語言特性的內容總結。

 

跨平臺

之前的ASP.NET版本是專門用於Windows平臺的,必須使用Windows 桌面版來編寫web應用,而且要使用windows server來發布並運行它。微軟讓ASP.NET Core 跨平臺了,不管開發仍是發佈均可以跨平臺。 .NET Core 可用於不少不一樣的平臺,包括Linux, OS X/mac OS ,也可能未來兼容其餘的平臺。

大多數ASP.NET Core MVC開發可能都會使用Visual Studio 來開發,可是微軟也建立了跨平臺的開發工具,叫作Visual Studio Code, 這意味着ASP.NET Core MVC的開發沒必要侷限於windows。

 

ASP.NET core MVC 是開源的

不像之前的微軟web 開發平臺,你如今能夠自由地下載ASP.NET Core 和ASP.NET Core MVC的源代碼,甚至能夠修改並編譯你本身的版本。當你調試進入系統組件,而且你想要單步跟蹤進入源代碼內部一看究竟,開源對你來講是很是重要的。另外,若是你想編寫一個高級組件,要想看看開發的可能性是否存在,或者研究內建的組件內部是如何工做的,開源也是很是有用的。

你能夠在這裏下載asp.net core 和ASP.NET Core MVC 源碼:

https://github.com/asp.net

 

讀這本書咱們須要什麼基礎?

要想從本書裏面學到更多東西,你應該熟悉web開發基礎知識,瞭解HTML 和CSS是如何工做的,具備C#的編程經驗。 若是你對客戶端的知識例如javascript不甚瞭解, 沒有關係,這本書的重點在服務器端開發。你能夠從例子中選取你須要的內容。 在第四章,咱們將會總結大多數有用的C# 語言特徵,尤爲對MVC的開發,你將會發現更新到最新的.NET版本是頗有用的。

 

這本書的結構是怎樣的?

這本書分紅兩部分,每一部分都包含相互之間有關聯的主題。

 

第一部分: 介紹ASP.NET Core MVC

我是從ASP.NET Core MVC開始介紹這本書的。我解釋了MVC模式的好處和對實踐的影響。討論了ASP.NET Core MVC 適合現代web開發,並描述了開發工具和C# 語言特徵,這些東西是每一個ASP.NET Core MVC程序員都須要瞭解的。

 

2章,咱們將深刻一個建立簡單web應用的過程,從中得到主要的組件和構建塊,以及它們之間如何相互匹配等相關知識。可是這一部分的主要內容,是經過一個叫作SportsStore項目,在該真實項目的從構思到發佈完整的開發週期中,向你展現ASP.NET Core MVC的開發過程。

 

第二部分 ASP.NET Core MVC詳解

第二部分,我解釋了用於構建SportsStore 的ASP.NET Core MVC 特性的內部工做原理。 向你展現了每個功能是如何工做的,解釋了他扮演的角色,展現了可用的配置和定製選項。在第一部分提出的普遍的內容,在第二部分都會給予更深刻的探討。

 

這一版有什麼新東西?

本版已對ASP.NET core MVC的描述作了修訂和擴展,它反映了微軟支持Web開發的方式的徹底轉變。早期版本的MVC框架是創建在ASP.NET Web窗體的基礎上的。這在爲MVC開發提供了一些成熟的基礎方面有必定的優點,可是這樣作的方式泄露了web form的工做細節。一些功能暴露了Web form內部的方式,在MVC中沒有任何這方面的負擔,應用程序和其餘功能不會產生不可預知的結果。       

此外,ASP.NET提供了.NET框架基礎應用組件,這意味着只有在微軟發佈新版本時纔可能進行重大更改。這是一個問題,由於網站發展的變化速度超過了.NET的變化。             ASP.NET core MVC是通過了徹底重寫的,保留了前版本的整體設計哲學,但使用了更新的API,以提升Web應用程序性能。ASP.NET core MVC 創建在ASP.NET core,它自己就是創建在一個徹底的重寫的網絡協議棧的基礎上。基本的Web form已經消失,與.NET Framework的緊密耦合已被打破。

若是你有MVC 5的經驗,你會發現變化的程度是驚人的,但不要恐慌,基本概念是相同的,許多重大的變化其實沒有那麼複雜。在這本書的第2部分,我總結了每一個主要特色的變化,以減輕從MVC 5 到 ASP.NET core MVC的過渡的痛苦。

 

去哪裏下載代碼?

你能夠從Apress.com上下載本書中全部章節的所有的例子。下載無需付費,包括全部的工程代碼和內容。你不用非得下載代碼,可是使用這些例子,將這些代碼剪切並粘貼到你本身的項目中將會是最容易的實驗方法。

 

小結

在本章,咱們介紹了ASP.NET Core MVC 的前世此生,它從Web Forms 到原來的ASP.NET MVC 框架的進化過程。咱們描述了使用ASP.NET Core MVC的好處、本書的結構,和你須要跟着學習的軟件。 下一章,你將會看到ASP.NET Core MVC框架的實例,一個介紹那些好處的簡單演示。

相關文章
相關標籤/搜索