这是我的文章备份 http://www.dotblogs.com.tw/mis2000lab/archive/2015/03/11/aspnet_5_introduce_scottgu_20150223.aspx
原文出处:http://weblogs.asp.net/scottgu/introducing-asp-net-5
以下中文翻译如果有不明确的地方,建议以原文为准。图片也来自原文网站。
如果您需要引用,请注明中文译者:MIS2000 Lab.,并保留URL超链接到本文章
http://www.dotblogs.com.tw/mis2000lab/archive/2015/03/11/aspnet_5_introduce_scottgu_20150223.aspx
===================================================================================
ASP.NET 5 简介(Introducing ASP.NET 5,原作ScottGu)
原作发表时间:2015/2/23
大约十五年前,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让您获得下列改进:
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上工作并且计划早日提供正式的预览版给大家。
译者批注:另一篇文章提到「当然这样的改变,变成这些 app 用到的 framework 必须是为 .NET Core 来撰写,所以不是所有现有的函式库(尤其是社群或第三方开发)都能在 .NET Core 上运作,这会是一次生态系的大变革。」....详见全文 http://blogs.msdn.com/b/msdntaiwan/archive/2015/02/04/net-core-clr.aspx
.NET Framewrok -- 上述.NET Core的API相较于完整版的.NET Framework,其功能较为受限(较少),因此您可能需要修改现行的应用程序才能用于.NET Core上头。如果您不希望修改应用程序就能直接运作,也可以在”完整版”的.NET Framework上(4.5.2版或是后续新版)运行ASP.NET 5应用程序。如此一来,您就可以存取完整的.NET Framework APIs了,您现行的应用程序与函式库不需任何修改就能直接在runtime上运作。
译者批注:您可以到这个网站,看看几张图片,就能理解上文提到 .NET Core 与完整版(Fully)的差异 http://blogs.msdn.com/b/bethmassi/archive/2015/02/25/understanding-net-2015.aspx
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更加得心应手。
以前可能要写成这样:
现在可以改写成这样:
Tag Helper能让您写的view画面更自然、可读性更高。也可以用来自定义HTML helper的输出,额外加入其他HTML编辑器的完整特性。
想要了解更多建立MVC 6应用程序的范例,可以参阅 http://www.asp.net/vnext/overview/aspnet-vnext。
新的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:如下图,您可以直接在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。
例如,假设您想用Grunt编译LESS文檔。只要到package.json里面加入「grunt-contrib-less」软件套件即可,它是一个第三方的Grunt plugin。关于grunt-contrib-less套件可以参阅 https://github.com/gruntjs/grunt-contrib-less 。
如下圖,使用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项目,并加入一个简单的时间服务:
01 |
using System; |
02 |
|
03 |
namespace WebApplication1 |
04 |
{ |
05 |
public class TimeService |
06 |
{ |
07 |
public TimeService() |
08 |
{ |
09 |
Ticks = DateTime.Now.Ticks.ToString(); |
10 |
} |
11 |
public String Ticks { get; set; } |
12 |
} |
13 |
} |
当constructor被呼叫时,这个简单服务类别(时间服务)被启动并设定当前的Ticks。
接下来,注册这个时间服务为Startup类别里面CoinfigurationServices方法的transient service。如下:
1 |
public void ConfigureServices(IServiceCollection services) |
2 |
{ |
3 |
services.AddMvc(); |
4 |
services.AddTransient<timeservice>(); |
5 |
}</timeservice> |
当TimeService对象被创建时,更新HomeController去使用constructor injection并且写到Ticks。如下。
01 |
public class HomeController : Controller |
02 |
{ |
03 |
public TimeService TimeService { get; set; } |
04 |
|
05 |
public HomeController(TimeService timeService) |
06 |
{ |
07 |
TimeService = timeService; |
08 |
} |
09 |
|
10 |
public IActionResult About() |
11 |
{ |
12 |
ViewBag.Message = TimeService.Ticks + " From Controller"; |
13 |
System.Threading.Thread.Sleep(1); |
14 |
return View(); |
15 |
} |
16 |
|
17 |
// Code removed for brevity |
18 |
} |
注意喔!Controller不会建立TimeService。只有当controller被实体化的时候才会被inject。
在MVC 6里面,您可以使用[Activate]属性(attribute)藉由属性(property)inject services。不光是可以用[Activate]在controller上,也可以在filter与view组件上使用。这表示您可以简化controller程序代码如下:
1 |
public class HomeController : Controller |
2 |
{ |
3 |
[Activate] |
4 |
public TimeService TimeService { get; set; } |
5 |
|
6 |
// Code removed for brevity |
7 |
} |
藉由关键词@inject,MVC 6也支持Razor view里面的DI。如下图的程序代码,我们已经将时间服务,直接inject到view画面里并且定义一个TimeSvc属性用来存取。
1 |
@using WebApplication23 |
2 |
@inject TimeService TimeSvc |
3 |
|
4 |
<h3>@ViewBag.Message</h3> |
5 |
|
6 |
<h3> |
7 |
@TimeSvc.Ticks From Razor |
8 |
</h3> |
当您执行这份应用程序时,可以看见controller与view有不同的(时间)tick值。如下图。
高速HTTP效能
ASP.NET 5导入了一个新的、模块化的HTTP 要求管道(request pipeline),所以您可以只加入所需要的组件(而不用包山包海全部放进来)。这个管道也不再依赖System.Web。透过管道上耗能的减少,您的应用程序可以有更好的流量表现,也可以有更多调校后的HTPP stack。新管道的精简化都源自Katana项目(http://katanaproject.codeplex.com/)与OWIN(http://owin.org/)的支援。
想要自定义使用在管道内的组件,可以使用Startup类别的Configure方法。Configure方法可以用来定义您用在需求管道(request pipeline)里面的中间件(middleware)。ASP.NET 5已经包含了很多源自Katana项目的中间件,例如middleware for static files、身份验证与系统诊断。下图展示了可在项目中的管道自行加入或是移除的特性:
01 |
public void Configure(IApplicationBuilder app) |
02 |
{ |
03 |
// Add static files to the request pipeline. |
04 |
app.UseStaticFiles(); |
05 |
|
06 |
// Add cookie-based authentication to the request pipeline. |
07 |
app.UseIdentity(); |
08 |
|
09 |
// Add MVC and routing to the request pipeline. |
10 |
app.UseMvc(routes => |
11 |
{ |
12 |
routes.MapRoute( |
13 |
name: "default", |
14 |
template: "{controller}/{action}/{id?}", |
15 |
defaults: new { controller = "Home", action = "Index" }); |
16 |
|
17 |
}); |
您也可以写自己专属的中间件(middleware)组件并且加入管道之中。
开放原始码(开放源码)
我们在GitHub上把ASP.NET 5当作一个开放原始码的项目(https://github.com/aspnet/home)。您可以检视这些程序代码、看看我们做了哪些异动、或是下载程序代码并提交您的修正。我们相信让ASP.NET 5开源可以让您更轻易地了解这些程序、了解我们的意向、并分享到项目里面。
文件与教程
想要开始学习ASP.NET 5,您可以在ASP.NET官方网站找到文件与教学范例(http://www.asp.net/vnext)。以下是开启您第一个ASP.NET 5项目的学习步骤:
http://www.asp.net/vnext/overview/aspnet-vnext/grunt-and-bower-in-visual-studio-2015
http://www.asp.net/vnext/overview/aspnet-vnext/vc
这篇文章也非常有帮助,请看http://blogs.msdn.com/b/webdev/archive/2015/02/23/aspnet-5-updates-for-feb-2015.aspx 。
这是我的文章备份 http://www.dotblogs.com.tw/mis2000lab/archive/2015/03/11/aspnet_5_introduce_scottgu_20150223.aspx