大約十五年前,ASP.NET 1.0的第一個預覽版(Preview)現身了。自此數百萬開發人員用它來建立與執行各種偉大的Web應用程式,經過這麼多年,我們在上面增加和進化很多很多的功能。
我(原文作者ScottGu)很高興在2015/2/23這天發布最新的ASP.NET版本,名為ASP.NET 5。這個新版本是我們對ASP.NET作過最顯著的架構更新之一。在這次釋出的版本中,我們讓ASP.NET更精簡、模組化、跨平台與雲端的最佳化。本次的ASP.NET 5預覽版(Preview),您可以透過下載( http://go.microsoft.com/fwlink/?LinkId=521794)最新版Visual Stduio 2015 CTP來使用它。 (譯者註解:2015/2/23為VS 2015 CTP 6)
ASP.NET 5是一個開源(開放原始碼)的web framework,可以用來開發和執行在Windows、Linux和Mac不同作業系統上的新Web應用程式。它包括MVC 6 framework,當下也結合了MVC和Web API的功能到一個single web programming framework裡面。ASP.NET 5也將是SignalR 3的基礎,讓您可以加入即時的功能(real time functionality)到雲端的應用程式裡面。 ASP.NET 5是建立在.NET Core runtime,但它也可以在完整的(full).NET framework上運作以達到最大的(向下)相容性。 (譯者註解:.NET開放原始碼的專案列表,請看 http://www.dotnetfoundation.org/projects)
在ASP.NET 5之中,我們正在做一系列的架構變化,藉此讓core web framework更加精簡(舉例來說,您再也不需要用到System.Web.dll了)、更加模組化(幾乎所有功能都可以藉由NuGet模組最佳化您的應用程式)。ASP.NET 5讓您獲得下列改進:
- 建構與執行在Windows、Mac和Linux上的跨平台ASP.NET
- 基於.NET Core,支援了side-by-side的app versioning(譯者註解:.NET Core支援不同應用程式使用各自獨立的runtime,版本互不干擾)。
- 新工具,讓新的Web開發更加簡化。
- Single aligned web stack for Web UI和Web APIs。
- 為雲端環境而建、即時可用的設定(Cloud-ready environment-based configuration)。
- 整合了創建和使用的NuGet軟體套件。
- 內建對於DI(dependency injection)的支援。
- 可以在IIS上建構主機,或是在自己的程序上自訂Host(Ability to host on IIS or self-host in your own process)。
ASP.NET終究會讓您覺得更熟悉,也更方便調校新一代的Web開發作業。
更具彈性、跨平台Runtime
ASP.NET 5有兩種runtime環境,讓您在選擇應用程式的主機時更具彈性。這兩種runtime選擇如下:
.NET Core -- 一個新的、模組化、跨平台的runtime而且體積更小了。當您鎖定.NET Core您就可以用到許多令人興奮的優點:
1). 您可以部署「專屬的」.NET Core runtime在您的應用程式上,如此一來你的應用程式將會執行與部署在這套您「專屬的」runtime版本上,而不是跟主機上作業系統所安裝的那套runtime綁死在一起。您的runtime版本可對應不同的應用程式side-by-side地運作(譯者註解:不同應用程式的runtime可以各自獨立)。必要時,您可以更新runtime而不會影響到其他應用程式,或是說,您也可以繼續運作現有的版本,不會因為其他應用程式修改runtime而對您造成影響。如此一來,在同一系統(主機)上進行應用程式部屬、架構更新時,會更加簡單、更加單純而不會干擾到其他應用程式的運作。
2). 您的應用程式只會用到自己需要的功能(譯者註解:用多少就裝多少)。因此,您永遠不會被系統提醒「該去更新那些您沒用到的runtime功能」了。從此再也不用曠日廢時地測試、部屬那些「跟自己應用程式無關」的系統更新。
3). 您的應用程式現在可以跨平台運作。我們將提供Windows、Linux和Mac OS X系統上都能運作的跨平台.NET Core版本。無論使用哪種作業系統來開發或是部屬,您都可以使用.NET。雖然跨平台的.NET版本尚未發布,但我們正努力在GitHub上工作並且計畫早日提供正式的預覽版給大家。
.NET Framewrok -- 上述.NET Core的API相較於完整版的.NET Framework,其功能較為受限(較少),因此您可能需要修改現行的應用程式才能用於.NET Core上頭。如果您不希望修改應用程式就能直接運作,也可以在”完整版”的.NET Framework上(4.5.2版或是後續新版)運行ASP.NET 5應用程式。如此一來,您就可以存取完整的.NET Framework APIs了,您現行的應用程式與函式庫不需任何修改就能直接在runtime上運作。
譯者註解:您可以到這個網站,看看幾張圖片,就能理解上文提到 .NET Core 與 完整版(Fully)的差異
MVC 6 -- 一個大一統的程式設計模組
MVC、Web API與Web Pages提供了互補的功能,因此在開發一套解決方案時通常會共用(譯者註解:Web Pages是使用Razor語法撰寫的網頁程式,跟ASP.NET Web Form不同)。然而在先前的ASP.NET版本中,這些程式設計的框架(framework)各自實施,因此包含一些重複和不一致之處。在MVC 6裡面,我們合併這些模組到單一的程式設計模組裡面。現在,您可以創建一個單一的Web應用程式並用它處理Web UI與資料服務,而不需要調整程式設計裡面的框架(framework)差異。您更可以把一開始用Web Pages寫成的網站無縫地融入更強大的MVC應用程式裡面。
您可以從同一個controller裡面傳回Razor view與content-negotiated data,並使用相同的MVC filter pipeline來實作。
除了統合了現有的框架,我們還增加了新的功能讓Server端的Web開發更加簡化,例如增加了很多新的tag helper幫助大家撰寫程式、畫面。這些tag helper讓您在view畫面中使用HTML helper更加得心應手。
以前可能要寫成這樣:
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
@Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })
@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })
現在可以改寫成這樣:
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<div class="form-group">
<label asp-for="UserName" class="col-md-2 control-label"></label>
<div class="col-md-10">
<input asp-for="UserName" class="form-control" />
<span asp-validation-for="UserName" class="text-danger"></span>
</div>
</div>
Tag Helper能讓您寫的view畫面更自然、可讀性更高。也可以用來自訂HTML helper的輸出,額外加入其他HTML編輯器的完整特性。
新的Web開發
本次(2015/2/23)釋出的ASP.NET 5 預覽版也包含許多有趣的特點,讓您能夠建構更好的 Web應用程式:
動態發展(Dynamic Development)
在Visual Studio 2015裡面,我們從動態編譯的優點裡,企圖讓開發經驗更加流暢。您再也不用每次小改變時就得重新編譯一次,如下圖,只要:(1). 編輯程式碼,(2). 存檔,(3). 直接刷新(refresh)瀏覽器,(4). 就能自動看到您剛剛的修改成果。
盡情享受您的開發經驗吧!如同撰寫直譯式語法一般,卻能享有編譯式語法的優勢。
您也可以選擇其他的程式碼編輯器來完成你的ASP.NET 5專案。Visual Studio使用者界面中的每一個功能都可以對應跨平台的命令行(Command-line)操作(譯者註解:也可以透過輸入指令碼來達成)。
與流行的Web開發工具整合(如Bower、Grunt與Gulp)
另一個令人開心的功能是Visual Studio 2015本身即支援了Bower、Grunt與Gulp這些廣受歡迎的開放原始碼(開源)工具,我們認為應該將它們包含在開發工具裡面。
Bower是一個用於用戶端(Client-side)的函式庫管理工具,包含了JavaScript與CSS函式庫。
說明與展示如下:
Bower:如下圖,您可以直接在bower.json檔案裡面加入一個JavaScript函式庫到ASP.NET專案裡面。
提醒您,Visual Studio透過許多可用的軟體套件來增強「智慧選字(IntelliSense)」功能。下次當您打開一個方案,Visual Studio會自動還原您先前遺失的軟體套件,您就不用大費周章地檢查這些原始檔(資源檔)了。
如果是Server端的軟體套件,您最好使用NuGet來幫忙。
Grunt:現在的Web開發,您通常得自己管理一大堆task,只是為了建立自己的應用程式,例如:編譯LESS、TypeScript或CoffeeScript檔案、做lint、縮減JavaScript檔案、執行JS單元測試等等。每個開發團隊都有自己的需求並且依賴各自所需的工具來完成。Task runner讓這些管理與協同工作更加簡單。Visual Studio 2015支援了兩種最流行的task runner,就是Grunt與Gulp。
如下圖,使用Visual Studio 2015裡面的Task Runner Explorer來綁定(繫結、bind)task的步驟如下:pre-build、post-build、clean或是在方案被打開的時候。
很輕易地就能在專案裡面將常用task給自動化,或是讓它們一起為您工作、以及用於跨團隊的專案之中。
Dependency Management的簡化
在ASP.NET 5可以透過NuGet來管理專案所需各種軟體套件之間的相依性(dependency)。您可以用NuGet Package Manager或只需編輯JSON文檔(例如project.json)就能列出專案用上的所有NuGet軟體套件與版本。project.json文檔簡單好用,你可以用任何文字編輯器來處理,即使應用程序已被部署到雲端也可以輕鬆改動這些設定。
project.json文檔如下:
如下圖,Visual Studio 2015智慧選字(IntelliSense)助您一臂之力,讓您迅速找到相關的NuGet軟體套件:
如下圖,智慧選字(IntelliSense)也幫您列出這些NuGet軟體套件的可用版本。
Cloud-ready(即時可上雲端)的設定
在ASP.NET 5之中,我們不需再用Web.config文檔來進行設定。我們想讓應用程式部屬到雲端的步驟更加簡化,而且可以自動讀取到正確的環境設定值。新系統使您能夠從各種來源(如JSON、XML或環境變數)獲得這些已經命名的設定值。您可以自行決定哪些格式最適合當前的狀況。
在Startup.cs文檔裡面,您現在可以新增或移除設定值。如下圖。
上述的程式碼片段用來表示:一個專案從JSON文檔裡面取得設定值與環境變數。您可以輕易地定義其他來源,例如config.json文檔裡面的設定(如下圖)。
在您的主機環境中,例如Windows Azure,在應用程式部屬之後可以設定環境變數與相關的設定值,用來取代本機上的預設值。不用擔心測試用的數值被部屬到(正式的)應用程式上。
Dependency injection(DI)
現有的ASP.NET framework,例如:MVC、Web API與SignalR已經支援Dependency injection(DI),但不夠一致化也不是全面普及。ASP.NET 5提供了一個內建的的DI abstraction,可以一致地遍及整個Web Stack。您可以在啟動時存取服務、在中介軟體(middleware)、filter、controller、Model Binding的時候…..幾乎任何地方都可以透過管道(pipeline)的各種部分,虛擬地使用您的服務。ASP.NET 5包含一個簡約的DI容器來導入(bootstrap)系統,但您可以輕鬆地選擇想要的容器(例如:Autofac、Ninject等)來替換預設的DI容器。服務可以是單一的(singleton),也可用來作為要求(request)或是transient。。
例如,下面的例子會讓您了解如何使用ASP.NET MVC 6的constructor injection去創建一個新的ASP.NET 5 Starter Web專案,並加入一個簡單的時間服務:
using System;
namespace WebApplication1
{
public class TimeService
{
public TimeService()
{
Ticks = DateTime.Now.Ticks.ToString();
}
public String Ticks { get; set; }
}
}
當constructor被呼叫時,這個簡單服務類別(時間服務)被啟動並設定當前的Ticks。
接下來,註冊這個時間服務為Startup類別裡面CoinfigurationServices方法的transient service。如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddTransient();
}
當TimeService物件被創建時,更新HomeController去使用constructor injection並且寫到Ticks。如下。
public class HomeController : Controller
{
public TimeService TimeService { get; set; }
public HomeController(TimeService timeService)
{
TimeService = timeService;
}
public IActionResult About()
{
ViewBag.Message = TimeService.Ticks + " From Controller";
System.Threading.Thread.Sleep(1);
return View();
}
}
注意喔!Controller不會建立TimeService。只有當controller被實體化的時候才會被inject。
在MVC 6裡面,您可以使用[Activate]屬性(attribute)藉由屬性(property)inject services。不光是可以用[Activate]在controller上,也可以在filter與view元件上使用。這表示您可以簡化controller程式碼如下:
public class HomeController : Controller
{
[Activate]
public TimeService TimeService { get; set; }
}
藉由關鍵字@inject,MVC 6也支援Razor view裡面的DI。如下圖的程式碼,我們已經將時間服務,直接inject到view畫面裡並且定義一個TimeSvc屬性用來存取。
@using WebApplication23
@inject TimeService TimeSvc
<h3>@ViewBag.Message</h3>
<h3>
@TimeSvc.Ticks From Razor
</h3>
當您執行這份應用程式時,可以看見controller與view有不同的(時間)tick值。如下圖。
高速HTTP效能
想要自訂使用在管道內的元件,可以使用Startup類別的Configure方法。Configure方法可以用來定義您用在需求管道(request pipeline)裡面的中介軟體(middleware)。ASP.NET 5已經包含了很多源自Katana專案的中介軟體,例如middleware for static files、身份驗證與系統診斷。下圖展示了可在專案中的管道自行加入或是移除的特性:
public void Configure(IApplicationBuilder app)
{
app.UseStaticFiles();
app.UseIdentity();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller}/{action}/{id?}",
defaults: new { controller = "Home", action = "Index" });
});
您也可以寫自己專屬的中介軟體(middleware)元件並且加入管道之中。
開放原始碼(開放源碼)
我們在GitHub上把ASP.NET 5當作一個開放原始碼的專案( https://github.com/aspnet/home)。您可以檢視這些程式碼、看看我們做了哪些異動、或是下載程式碼並提交您的修正。我們相信讓ASP.NET 5開源可以讓您更輕易地瞭解這些程式、瞭解我們的意向、並分享到專案裡面。
文件與教程
- Manage Client-Side Web Development in Visual Studio 2015, Using Grunt and Bower
- View components and Inject in ASP.NET MVC 6
|