2014年11月12日的Connect ();開發者活動上宣布將.NET堆棧基於MIT協議開源,並且提供開源保證,托管在Github上。當時的版本與最終目標相距甚遠,然而有一點可以肯定的是,這是一個與.NET Framework 4.x完全不同的框架。
這在社區引發了諸多疑惑和爭論。進行劇烈變更的原因顯而易見:.NET Framework 4.x已經無法充分發揮最新的技術的威力,而且無法完全滿足開發跨平台,雲化的大規模應用需求,而一個全新的框架可以讓.NET開發者以更簡單、更直接的方式來開發Web服務與應用。然而,大家普遍感到擔憂。如果把所使用的第三方軟件代碼庫升級到最新版本,然後導致不能向下兼容的問題,這是開發者最大的噩夢。遷移的問題看起來無比艱巨,甚至毫無可能,在github社區上大家提出了遷移思路,微軟dotnet團隊在統一.NET 三大平台的基礎上,讓我們的遷移更加簡單,能充分享受到.NET Core的各種優點。
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戰略,請看下面這張圖:
我的應用程序往往是混合的,不僅包括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 的開發過程:開發團隊會每周與社區跟進進度、討論計劃,隨時在線上回答其他開發者的提問,合並其他開發者貢獻的代碼。筆者也有幸見證這一過程,並實際參與到其中幾個項目的貢獻中。
對跨平台的需求是真實存在的:我們使用 Windows 或 macOS 從事開發工作,而使用 Linux 系統作為服務器環境;我們開發一套運行在服務器上的軟件產品,希望將服務器平台的選擇自由留給客戶……因此對於現代化的輕量級開發技術棧而言,跨平台也成為一個基本要素。典型的輕量級開發平台大多是基於動態語言的,比如 PHP、Python 或 Node.js,這類動態語言正是由於“動態語言”的特性,在一些場合顯得過於靈活、難以掌控,在工程的內建質量和開發效率上取得平衡並不容易。
對於 .NET Core 來說,跨平台這個目標並沒有多少歷史包袱,.NET Framework 只能運行在Windows平台上,Mono項目是個運行多年的開源社區項目。在開發 .NET Core 本身的過程中,開發團隊很早就使用了持續集成的實踐來保障代碼針對多個平台的兼容能力。在開發進程中,團隊同步維護多個示例項目,例如經典的 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的文章和資訊。