这是我的文章备份 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,可以用来开发和执行在WindowsLinuxMac不同操作系统上的新Web应用程序。它包括MVC 6 framework,当下也结合了MVCWeb 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上工作并且计划早日提供正式的预览版给大家。

译者批注:另一篇文章提到「当然这样的改变,变成这些 app 用到的 framework 必须是为 .NET Core 来撰写,所以不是所有现有的函式库(尤其是社群或第三方开发)都能在 .NET Core 上运作,这会是一次生态系的大变革。」....详见全文  http://blogs.msdn.com/b/msdntaiwan/archive/2015/02/04/net-core-clr.aspx

.NET Framewrok -- 上述.NET CoreAPI相较于完整版的.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更加得心应手。

以前可能要写成这样:

1

@Html.ValidationSummary(true, "", new { @class = "text-danger" })

2

3

4

@Html.LabelFor(m => m.UserName, new { @class = "col-md-2 control-label" })

5

6

@Html.TextBoxFor(m => m.UserName, new { @class = "form-control" }) @Html.ValidationMessageFor(m => m.UserName, "", new { @class = "text-danger" })

现在可以改写成这样:

1

<div asp-validation-summary="ModelOnly" class="text-danger"></div>

2

<div class="form-group">

3

<label asp-for="UserName" class="col-md-2 control-label"></label>

4

<div class="col-md-10">

5

<input asp-for="UserName" class="form-control" />

6

<span asp-validation-for="UserName" class="text-danger"></span>

7

</div>

8

</div>

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开发工具整合(如BowerGruntGulp

另一个令人开心的功能是Visual Studio 2015本身即支持了Bower、Grunt与Gulp这些广受欢迎的开放原始码(开源)工具,我们认为应该将它们包含在开发工具里面。

  • Bower是一个用于客户端(Client-side)的函式库管理工具,包含了JavaScript与CSS函式库。
  • GruntGulp是task runner,用来协助您自动化Web开发流程。您可以使用他们来编译LESS、CoffeeScript或TypeScript档案,执行JSLint或是缩减JavaScript档案。

说明与展示如下:

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 injectionDI

现有的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项目的学习步骤:

  • Manage Client-Side Web Development in Visual Studio 2015, Using Grunt and Bower

http://www.asp.net/vnext/overview/aspnet-vnext/grunt-and-bower-in-visual-studio-2015

  • View components and Inject in ASP.NET MVC 6

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

[中文翻译] ASP.NET 5 简介(Introducing ASP.NET 5,原作ScottGu 2015/2/23)的更多相关文章

  1. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  2. 《Entity Framework 6 Recipes》中文翻译系列 (21) -----第四章 ASP.NET MVC中使用实体框架之在页面中创建查询和使用ASP.NET URL路由过虑

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 4.2. 构建一个搜索查询 搜索数据是几乎所有应用的一个基本功能.它一般是动态的,因 ...

  3. ASP.NET 5简介

    ASP.NET 5简介 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介 2015-05-13 09:14 by 汤姆大叔, 3379 阅读, 39 评论, 收藏, 编辑 ...

  4. 《Entity Framework 6 Recipes》中文翻译系列 目录篇 -持续更新

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

  5. 《Entity Framework 6 Recipes》中文翻译 ---- 系列教程

    为了方便大家的阅读和学习,也是响应网友的建议,在这里为这个系列做一个目录.在目录开始这前,我先来回答之前遇到的几个问题. 1.为什么要学习EF? 这个问题很简单,项目需要.这不像学校,没人强迫你学习! ...

  6. [翻译] ASP.NET Core 简介

    ASP.NET Core 简介 原文地址:Introduction to ASP.NET Core         译文地址:asp.net core 简介           翻译:ganqiyin ...

  7. Introducing ASP.NET vNext and MVC 6

    [译]Introducing ASP.NET vNext and MVC 6 原文:http://www.infoq.com/news/2014/05/ASP.NET-vNext?utm_source ...

  8. 酷学习笔记——ASP.NET Core 简介

    ASP.NET Core 简介 其实就是说酷好,不好好学,不学好,没饭吃. 新词汇:IoT,Internet of Things,网联网,微软物联网英文网站.微软物联网中文网站

  9. 解读ASP.NET 5 & MVC6系列(1):ASP.NET 5简介

    ASP.NET 5简介 ASP.NET 5是一个跨时代的改写,所有的功能和模块都进行了独立拆分,做到了彻底解耦.为了这些改写,微软也是蛮 拼的,几乎把.NET Framwrok全部改写了一遍,形成了一 ...

随机推荐

  1. URL shortening service

    Use Cases 1, shortening : take a URL => return a much shorter URL 2, redirection : take a short U ...

  2. Spring Boot实现学生信息增删改查

    上一篇博客写了如何初始化一个简单的Spring Boot项目,这次详细记录一下如何连接数据库并实现增删改查基本操作. 我使用的是MySQL 5.5+Navicat,MySQL量级比较轻,当然微软的SQ ...

  3. The Truth About GCHandles

    I've heard several people asking why GCHandle doesn't implement IDisposable, considering it wraps an ...

  4. 将Angular6自己定义的模块发布成npm包

    创建自己的模块组件 1. ng new 一个工程 2. ng g m 创建模块 例如我这里的modules文件下创建header模块 3. ng g c modules/head 创建一个hear组件 ...

  5. Java Servlet图片上传至指定文件夹并显示图片

    在学习Servlet过程中,针对图片上传做了一个Demo,实现的功能是:在a页面上传图片,点击提交后,将图片保存到服务器指定路径(D:/image):跳转到b页面,b页面读取展示绝对路径(D:/ima ...

  6. ReentrantLock锁 源码分析

    根据下面代码分析下ReentrantLock 获得锁和释放锁的过程 ReentrantLock lock = new ReentrantLock(); lock.lock();//获得锁 lock.u ...

  7. pyinstaller打包多个py文件仍报错ModuleNotFoundError: No module named 'xxx'

    [问题现象] 使用pyinstaller A.py -p b.py -p c.py打包多个文件 或者使用main.spec在Analysis配置好各个文件打包 打包成功后,运行main.exe仍然报错 ...

  8. 黑马旅游网 ajax+html在前端实现页标签个数控制

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 牛客假日团队赛2 F.跳跃

    链接: https://ac.nowcoder.com/acm/contest/924/F 题意: Farmer John为了满足奶牛对美的享受而安装了人工湖.矩形的人工湖分成M行N列(1 <= ...

  10. exportExcel()方法注意事项

    1.保证数据集里的字段和SQL语句里字段全部一致,包括sql语句里必须有系统字段 2.exportExcel()执行的时候,是先去执行SQL语句,再去到数据集里面进行不对,若有不一致的地方,则报列名无 ...