標籤:應用程式 html5 全雙工系統 .net 用戶端
Web的進化--大前端時代
近年來,Web已經發生了大幅度的進化,以NodeJs為代表的,我們知道,Javascript最初開發的這門語言的時候,目標只是用來編寫簡單的用戶端指令碼,但是隨著時間的推移,它的角色已經發生了很大的轉變。現在,我們可以利用HTML5提供的API來處理音頻和視頻檔案,用全雙工系統通道和外部服務進行通訊,傳輸和處理大塊未經處理資料,如此等等。我們已經來到了大前端時代,大前端時代是WEB統一的時代,利用html5或者6甚至7,不但可以開發傳統的網站,做炫酷的網頁動態效果,更可以採用BS架構應用程式、開發手機端web應用、移動端Native應用程式、智慧型裝置(比如可穿戴智能手錶,可穿戴智能衣服)等。
ASP.NET Core作為.NET Core平台上的Web服務開發架構也是順應大前端時代進行設計,ASP.NET Core是模組化,內建依賴注入,可整合任意前端架構的完全開源的Web平台,統一了ASP.NET MVC/WEB API/SignalR的編程模型。
如果在.NET Framework 4.x/Mono平台上來適應大前端時代,內部實現會變得相當複雜。因為架構已開始壓根就不是基於這樣的一個時代進行設計的。想想我們哪笨重的WebForm架構是VB/Dephi流行的重用戶端時代的產品,微軟硬把他搬到了Web上,所以ASP.NET Core已經不支援Web Form,ASP.NET MVC平台是微軟為適應Web時代重新設計的一個開發平台,從ASP.NET MVC 1.0 進化到ASP.NET MVC 6.0也就是這個Web的進化過程,在這個進化過程中,針對WEB的不同情境出現了三個平台MVC,WEB API和SignalR。我們已經來到了大前端時代,所以ASP.NET團隊考慮重新設計這個平台。
雲端運算時代
近年來,我們已經進入雲端運算時代,在雲平台的PaSS和SaSS上也是發生了大幅度的進化,以docker為代表。微軟的Azure平台,google的GAE等等各大雲端運算廠商都提供了PaSS平台,我們的應用程式要遷移到這樣的平台上都需要進行重寫。Docker,給雲端運算帶來一場革新,Docker可以被認為是互連網的集裝箱,可以靈活地封裝軟體,令其更快速地傳播。這對現代互連網來說是一件大事,因為軟體都會運行上成百上千的機器上。Docker可以改變我們開發軟體的方式,令每個人都能便捷地利用大量的運算能力。Docker可以讓開發人員專註於開發軟體,不需要考慮在哪裡運行自己的軟體,這才是雲端運算的發展方向。開發人員考慮應用本身就足夠了。
.NET 很難進入以docker為代表的雲端運算開發平台,特別是Windows不支援Docker,因為那完全是互連網服務的基石--Linux系統才有的技術,微軟為了適應這樣的雲端運算潮流,在Windows Server 2016/Windows 10上支援了docker,也重新開發跨平台.NET Core的應用運行平台。.NET實際上是一系列架構,每個架構針對一個特定平台,而且歸不同的微軟團隊所有,這在API和實現方面都不可避免地產生了差異。.NET Core是.NET Framework的一個新的分支,旨在為特定於平台的擴充提供一個共同的基礎。每個擴充提供只能用於特定應用程式模型的API,例如,面向.NET本地應用程式的WinRT互操作擴充或者面向ASP.NET Core應用程式的MVC。這個共同的層稱為統一基底類別庫(BCL),它位於一個包含.NET運行時的薄層之上。.NET Core帶來的另外一項有趣的變化是使用NuGet作為基本的交付系統。.NET Core將會作為一個細粒度的包的集合交付,每個包對應一個程式集。同時,微軟將提供.NET Core分發包。本質上,它只是經過微軟測試的、特定.NET版本的所有包的快照副本,用於那些不需要額外的自由進行NuGet包混搭的情境。NuGet的使用以及向更加模組化的設計轉變使“.NET Core平台有可能轉變成一種應用程式本地架構。”如此一來,每個應用程式將只需要部署架構中它需要的部分。這樣做的主要好處是,當應用程式需要升級.NET Core時,將不會破壞與其它現有應用程式的相容性,而升級整台機器共用的.NET Framework就會如此。
從.NET Framework 4.x/Mono中學習到的經驗
為了順應潮流,架構不得不進行重新實現,但是有一點我們必須牢記:我們並非白手起家,我們擁有從.NET Framework 4.x/Mono 架構中所學到的經驗。自從2009年以來,並非只有Web進化,我們也在構建越來越複雜的應用。今天,雲化的應用不再是標新立異之舉,而更像是所有業務型Web應用的標配。
利用.NET Framework 4.x/Mono,我們已經可以構建高效、大規模的雲應用。然而,在大量的案例中,我們發現了它有很嚴重的缺陷,特別是中國發生的大量互連網公司不斷的從.NET平台遷移到Java平台,各大雲平台廠商也都不支援.NET Framework平台,只有可憐Windows Azure支援。為了滿足這些新的需求,微軟.NET團隊從社區中吸取了大量的經驗,開始運用全新的思路進行設計,我們在看到.NET Core提供的新特性的同時,也應該看到它是根據.NET Framework 4.x特別是Mono 項目的經驗發展而來的,然後再想一想,在過去幾年中,那些困擾我們.NET開發人員的問題是否被解決掉了。
統一的編程模型
我們在.NET Framework/Mono上有4個Web編程模型,ASP.NET WebForm、ASP.NET MVC 、ASP.net Web API、 SignalR。對Web開發的不同情境需要使用不同的編程模型,讓我們學習的成本很高,導致這4個編程模型中,很多的開發人員只會其中的一部分,特別是SignalR很多人都不知道。微軟也一直在推動One ASP.NET戰略,請看下面這張圖:
oneaspnet
我的應用程式往往是混合的,不僅包括Web Form,MVC還包括SignalR和 Web API,我們的應用程式搞得很複雜,ASP.NET Core重新設計,把ASP.NET MVC、ASP.NET Web API和SignalR的編程模型統一,直接廢除過時的WebForms,讓我們只需要使用一個統一的模型進行Web開發。同時針對我們的大前端時代的特點,讓我們可以很輕鬆的整合任意的前端架構。
依賴注入
在物件導向的領域裡,依賴注入是物件導向的五大原則之一,在.NET Framework/Mono的社區裡存在大量的Inversion of Control(IOC)機制的架構。依賴注入可以帶來很多好處,比如:易測試性,更好的代碼結構和模組化,以及更簡潔明了。雖然在.NET Framework/Mono架構內部已經帶了一個MEF,並不是我們的必選項,在.NET Core中中可以說是用了全新的IOC模板,定義在Microsoft.Extensions.DependencyInjection下。提供了一套標準的介面。並提供了預設實現。並且大範圍使用著,處處都體現著IOC的設計思想。
開源和跨平台
在 GitHub 上,與 .NET Core 相關的程式碼程式庫有一百來個,分布在多個賬戶中。來自世界各地、包括中國的大量開發人員都參與了 .NET Core 的開發過程:Team Dev會每周與社區跟進進度、討論計劃,隨時線上上回答其他開發人員的提問,合并其他開發人員貢獻的代碼。筆者也有幸見證這一過程,並實際參與到其中幾個項目的貢獻中。
對跨平台的需求是真實存在的:我們使用 Windows 或 macOS 從事開發工作,而使用 Linux 系統作為伺服器環境;我們開發一套運行在伺服器上的軟體產品,希望將伺服器平台的選擇自由留給客戶……因此對於現代化的輕量級開發技術棧而言,跨平台也成為一個基本要素。典型的輕量級開發平台大多是基於動態語言的,比如 PHP、Python 或 Node.js,這類動態語言正是由於“動態語言”的特性,在一些場合顯得過於靈活、難以掌控,在工程的內建品質和開發效率上取得平衡並不容易。
對於 .NET Core 來說,跨平台這個目標並沒有多少曆史包袱,.NET Framework 只能運行在Windows平台上,Mono項目是個運行多年的開源社區項目。在開發 .NET Core 本身的過程中,Team Dev很早就使用了持續整合的實踐來保障代碼針對多個平台的相容能力。在開發進程中,團隊同步維護多個樣本項目,例如經典的 MusicStore,及時迴歸核心特性、保障穩定性。從兩年之前開始,就陸續有 alpha、beta 和 RC 版本發布出來,讓開發人員提前體驗到新運行時的同時,也藉助 GitHub 開源平台及早收到來自社區的監督和協助。藉助這些一系列的措施,.NET Core 跨平台的能力有著充分的事實保障
高生產力平台
新打造的 .NET Core 有一些關鍵特性,頗具吸引力。例如與特定作業系統無耦合,可編譯為原生平台代碼,運行效率極高;完全模組化, 內建包管理器用於管理依賴項;提供完整而標準化的命令列工具集,與 Docker 等新近技術能無縫整合。它雖然是全新的開發平台,卻直接使用 C# 這樣的明星靜態語言的最新版本作為開發語言,充分運用 .NET 平台十幾年積累的設計理念,汲取過去數十年各種程式設計語言和開發模型中的精華,才最終鍛煉成適用於下一代開發工作的新平台。
一套面向非 Windows 環境的生態系統工具也在同期陸續地發布了出來,包括跨平台的編輯器 Visual Studio Code,高效能 Web 服務器 Kestrel 以及持續整合編譯工具 Cake 等,Visual Studio 2017 目前正在Preview階段,馬上就會迎來RC,對我們的Windows下開發工具的支援上更加完善。
在國外,不少開發人員已經在積極響應 .NET Core 的路線,發布基於 .NET Core 的運行時的類庫,提供相容 .NET Core 的 SDK 等。常用的 XUnit.net、Moq、Autofac、MongoDB 和 RavenDB 等流行的類庫和工具已經提供了對 .NET Core 的支援,或正在積極地開發新的版本。在國內 .NET Core 在社區中的交流學習也正在穩步鋪開。很多開發人員已經著手文檔翻譯、源碼學習,以及實踐分享等工作,也有不少的開源項目。在部落格園網站上已經出現不少關於 .NET Core 的文章,而在我運營的公眾號“dotNET 跨平台”中,一直在給大家優先推送.NET Core的文章和資訊。
.net core快速上手