• [中文翻译] ASP.NET 5 简介(Introducing ASP.NET 5,原作ScottGu 2015/2/23)


    这是我的文章备份 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). 就能自动看到您刚刚的修改成果。

     image

    尽情享受您的开发经验吧!如同撰写直译式语法一般,却能享有编译式语法的优势。

    您也可以选择其他的程序代码编辑器来完成你的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项目里面。

     image

    提醒您,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 。

    image

    如下圖,使用Visual Studio 2015裡面的Task Runner Explorer來綁定(繫結、bind)task的步驟如下:pre-build、post-build、clean或是在方案被打開的時候。

    image

    很轻易地就能在项目里面将常用task给自动化,或是让它们一起为您工作、以及用于跨团队的项目之中。

    Dependency Management的简化

    在ASP.NET 5可以透过NuGet来管理项目所需各种软件套件之间的相依性(dependency)。您可以用NuGet Package Manager或只需编辑JSON文檔(例如project.json)就能列出项目用上的所有NuGet软件套件与版本。project.json文档简单好用,你可以用任何文本编辑器来处理,即使应用程序已被部署到云端也可以轻松改动这些设定。

    project.json文檔如下:

    image

    如下圖,Visual Studio 2015智慧選字(IntelliSense)助您一臂之力,讓您迅速找到相關的NuGet軟體套件:

    image

    如下圖,智慧選字(IntelliSense)也幫您列出這些NuGet軟體套件的可用版本。

    image

    Cloud-ready(实时可上云端)的设定

    在ASP.NET 5之中,我们不需再用Web.config文档来进行设定。我们想让应用程序部属到云端的步骤更加简化,而且可以自动读取到正确的环境设定值。新系统使您能够从各种来源(如JSON、XML或环境变量)获得这些已经命名的设定值。您可以自行决定哪些格式最适合当前的状况。

    在Startup.cs文档里面,您现在可以新增或移除设定值。如下图。

    上述的代码段用来表示:一个项目从JSON文档里面取得设定值与环境变量。您可以轻易地定义其他来源,例如config.json文档里面的设定(如下图)。

     image

    在您的主机环境中,例如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值。如下图。

     image

    高速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

  • 相关阅读:
    iOS10权限声明国际化
    用"僵尸对象"调试内存管理问题
    windows系统下的两个批处理命令
    解决windows系统下打开应用弹出丢失libmysql.dll的问题
    简单的cocos2dx笔试题
    解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
    mac 使用homebrew 安装mysql
    cocos2dx for lua 简单的翻牌动画
    cocos2dx for lua A*寻路算法实现2
    解决升级mac os X EI Capitan后遇到LibclangError: dlopen(libclang.dylib, 6): image not found.的问题
  • 原文地址:https://www.cnblogs.com/mis2000lab/p/4494521.html
Copyright © 2020-2023  润新知