Pull to refresh

Важнейшие изменения в ASP.NET 5 и MVC 6

Reading time 8 min
Views 64K
Original author: Stephen Walther
Доброе утро, дорогие читатели.

Мы начнем неделю с такого информативного, пусть и несколько тезисного перевода, который поможет нам уточнить, насколько аудитория заинтересована в издании книг по ASP.NET. Практика показала, что книги Питера "Разработка приложений с испоользованием ASP.NET и AJAX" и "Программирование с использованием Microsoft ASP.NET 4" не пользовались бешеным спросом. Однако вполне возможно, что по результатам данного поста мы все-таки решимся замахнуться на ASP.NET 5 и MVC 6.

Обновление от 30 апреля 2015.

В первой редакции этого поста я написал, что компания Microsoft не планирует поддерживать VB.NET в ASP.NET 5/MVC 6. Действительно, сначала так и было, но мой пост вызвал бурную реакцию в сообществе VB.NET. Итак, по всей видимости, VB.NET снова в обойме!
www.infoq.com/news/2015/04/VB-Core

Последние пару недель я провел за написанием образцов кода для ASP.NET 5/MVC 6. Я был просто поражен глубиной изменений, внесенных в бета-версию ASP.NET 5, актуальную на текущий момент. ASP.NET 5 — это самый значительный новый релиз в истории всего фреймворка ASP.NET — можно сказать, что весь фреймворк переписан заново.

В этой статье я остановлюсь на 10 изменениях в ASP.NET 5, которые кажутся мне наиболее существенными. Список очень субъективный. Если вы хотели бы упомянуть о каких-то других изменениях – опишите их в комментариях.

1. ASP.NET в OSX и Linux



Впервые в истории ASP.NET приложения ASP.NET 5 могут работать в операционных системах OSX и Linux. Еще раз подчеркну: приложения ASP.NET 5 могут работать в Windows, OSX и Linux. Этот факт открывает ASP.NET для множества разработчиков и дизайнеров, которые ранее не могли пользоваться данным фреймворком.
Традиционная аудитория ASP.NET — это профессиональные программисты, работающие в больших корпорациях. Клиенты таких корпораций намертво прикованы к своим компьютерам с Windows.

Совершенно иная ситуация складывается на стартапах, где принято работать с OSX/Linux. Всякий раз, когда я попадаю на конференцию по стартапам, оказывается, что вся аудитория работает с Macbook Pro. Как правило, эти люди не работают с ASP.NET.

Кроме того, дизайнеры и разработчики клиентской части – как минимум, те, кто трудится за пределами корпоративных застенков – также любят работать с Macbook. Стоит мне оказаться на конференции по jQuery, повсюду одни Macbook Pro (следующая картинка взята из тематического блога по jQuery).

Теперь, когда ASP.NET 5 будет работать на Windows, OSX и Linux, изменится все. Впервые сборка приложений при помощи ASP.NET 5 доступна для любых разработчиков и дизайнеров. Причем они могут творить в своих любимых средах разработки, например, в Sublime Text и WebStorm (Visual Studio не требуется).

Познакомьтесь с проектом OmniSharp и оцените, как с ASP.NET 5 можно использовать различные текстовые редакторы — в частности, Sublime Text, Atom, Emacs и Brackets:
www.omnisharp.net

2. Больше никаких веб-форм

Люблю веб-формы ASP.NET. За всю жизнь я потратил сотни — а то и тысячи — часов на программирование приложений с Web Forms. Однако теперь настало время с ними попрощаться. В ASP.NET 5 веб-форм больше не будет.

Приложения с Web Forms можно и дальше программировать в Visual Studio 2015, задав в качестве целевой платформы фреймворк .NET 4.6. Однако приложения с веб-формами не позволяют работать ни с одной из новых классных возможностей ASP.NET 5, описанных в этом списке. Если вы не хотите остаться на обочине исторического прогресса, то сейчас — самое время наконец-то переписать ваше приложение с Web Forms на ASP.NET MVC.

3. Tag Helpers

Tag Helpers (помощники) – вероятно, та самая возможность, которая может наиболее сильно повлиять на представления, создаваемые вами в приложении ASP.NET MVC. Tag Helpers — более удобная альтернатива, нежели традиционные MVC-помощники.

Рассмотрим следующее представление MVC, в котором содержится форма для создания нового продукта:

@model MyProject.Models.Product
 
 
@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(m => p.Name, "Name:")
        @Html.TextBoxFor(m => p.Name)
    </div>
    <input type="submit" value="Create" />
}


В вышеприведенном примере помощники Html.BeginForm() Html.LabelFor() и Html.TextBoxFor() применяются для создания формы. Эти помощники вряд ли встречались HTML-дизайнеру.
Вот как точно такая же форма создается при помощи Tag Helpers:

@model MyProject.Models.Product
@addtaghelper "Microsoft.AspNet.Mvc.TagHelpers"
 
<form asp-controller="Products" asp-action="Create" method="post">
    <div>
        <label asp-for="Name">Name:</label>
        <input asp-for="Name" />
    </div>
 
    <input type="submit" value="Save" />
</form>


Обратите внимание: в этой обновленной версии формы содержатся только HTML-элементы (по крайней мере, так кажется на первый взгляд). Например, в форме имеется элемент INPUT, а не помощник Html.TextBoxFor(). Дизайнеру клиентской части эта страница бы понравилась. Все тонкости, присущие этому представлению, связаны с его атрибутами asp-for. Эти атрибуты используются для дополнения элементов серверным функционалом ASP.NET MVC.
В следующей статье Дамьен Эдвардс демонстрирует целый сайт, где не используется ничего кроме Tag Helpers:
github.com/DamianEdwards/TagHelperStarterWeb

4. Компоненты представлений

Прощайте субконтроллеры, да здравствуют компоненты представлений (View Components)!
В предыдущих версиях ASP.NET MVC мы использовали помощник Html.Action() для вызова субконтроллера. Допустим, вы хотите отображать сразу в нескольких представлениях рекламный баннер. В данном случае потребовалось бы создать субконтроллер, в котором бы содержалась логика для возврата конкретного баннера, а срабатывал бы субконтроллер в результате вызова помощника Html.Action() из представления.
Субконтроллеры – помощник Html.Action() — отсутствуют в актуальной бета-версии MVC 6. Вместо них в MVC 6 применяется альтернативная технология, называемая View Components (компоненты представлений).

Вот как создать компонент представления, отображающий один из двух рекламных баннеров в зависимости от времени суток:

using Microsoft.AspNet.Mvc;
using System;
 
namespace Partials.Components
{
    public class BannerAd : ViewComponent
    {
        public IViewComponentResult Invoke()
        {
            var adText = "Buy more coffee!";
 
            if (DateTime.Now.Hour > 18)
            {
                adText = "Buy more warm milk!";
            }
            return View("_Advertisement", adText);
        }
    }
} 



В период до 17.00 компонент представления возвращает частичный шаблон под названием _Advertisement с рекламным текстом “Buy more coffee!”. В период после 17.00 этот текст изменяется на “Buy more warm milk!”.
Вот как выглядит частичный шаблон _Advertisement:

@model string
 
<div style="border:2px solid green;padding:15px">
    @Model
</div>


Наконец, вот как можно использовать компонент представления BannerAd в представлении MVС:

@Component.Invoke("BannerAd")


Компоненты представлений очень похожи на субконтроллеры. Однако субконтроллеры всегда были странноватыми. Они должны были работать как контроллеры действий, но на практике таковыми не являлись. Компоненты представлений выглядят гораздо естественнее.

5. GruntJS, NPM и Bower Support



Разработчики клиентской части искренне полюбят ASP.NET 5 благодаря тому, что в этом фреймворке поддерживается GruntJS (и, в конечном итоге, Gulp).

GruntJS — это диспетчер задач, позволяющий собирать ресурсы для клиентской части, например, файлы JavaScript и CSS. Например, GruntJS можно использовать для конкатенации и уменьшения файлов JavaScript при выполнении каждой сборки в Visual Studio.

Есть тысячи плагинов GruntJS, позволяющих решать невообразимое количество задач (в настоящее время в репозитории плагинов GruntJS насчитывается 4334 таких модуля):
gruntjs.com/plugins

Например, здесь вы найдете плагины для запуска модульных тестов JavaScript, валидации качества кода JavaScript (jshint), компиляции файлов LESS и Sass в CSS, компиляции TypeScript в JavaScript и уменьшения изображений.
Для обеспечения поддержки GruntJS компании Microsoft потребовалось поддерживать два новых менеджера пакетов (кроме NuGet). Во-первых, поскольку плагины GruntJS распространяются в виде NPM-пакетов, Microsoft добавила поддержку NPM-пакетов.

Во-вторых, поскольку многие клиентские ресурсы, в частности, Twitter Bootstrap, jQuery, Polymer и AngularJS – распространяются через Bower, Microsoft добавила поддержку Bower.

Таким образом, можно запускать GruntJS при помощи плагинов из NPM, а клиентские ресурсы из Bower.

6. Унифицированные контроллеры MVC и Web API

В предыдущих версиях ASP.NET MVC контроллеры MVC отличались от контроллеров Web API. Контроллер MVC использовал базовый класс System.Web.MVC.Controller, а контроллер Web API — базовый класс System.Web.Http.ApiController.

В MVC 6 остался всего один класс Controller, являющийся базовым для всех контроллеров MVC и Web API. Речь идет о классе Microsoft.AspNet.Mvc.Controller.

Контроллеры MVC 6 возвращают интерфейсы IActionResult. При использовании в качестве MVC-контроллера IActionResult может быть представлением. В случае Web API-контроллера IActionResult может быть данными (например, списком продуктов). У одного и того же контроллера могут быть действия, возвращающие как представления, так и данные.

В MVC 6 как MVC-контроллеры, так и Web API-контроллеры используют одни и те же маршруты. Можно применять либо маршруты, действующие по соглашениям, либо маршруты на основе атрибутов. Они применяются ко всем контроллерам в проекте.

7. AngularJS

AngularJS – это один из популярнейших клиентских фреймворков для создания одностраничных приложений (SPA). В Visual Studio 2015 есть шаблоны для создания модулей, контроллеров, директив и фабрик AngularJS.

Благодаря поддержке GruntJS в ASP.NET 5, ASP.NET оказывается великолепным серверным фреймворком для создания клиентских приложений AngularJS. Можно автоматически комбинировать и уменьшать все ваши файлы AngularJS при выполнении каждой сборки. Можно взаимодействовать с контроллером MVC 6 из $resource AngularJS при помощи REST.

8. Фреймворк внедрения зависимостей в ASP.NET

В ASP.NET 5 имеется встроенная поддержка внедрения зависимостей и паттерна «локатор служб». Таким образом, вы больше не зависите от сторонних фреймворков для внедрения зависимостей, например, от Ninject или AutoFac.
Допустим, вы создали интерфейс IRepository и класс EFRepository, реализующий этот интерфейс. В таком случае можно привязать класс EFRepository к интерфейсу IRepository при помощи метода ConfigureServices() класса Startup.cs вот так:

services.AddTransient<IRepository, EFRepository>();


Связав EFRepository и IRepository, вы можете внедрить зависимость конструктора в ваши MVC-контроллеры (и любой другой класс) при помощи подобного кода:

public class ProductsController : Controller
{
    private IRepository _repo;
 
    public ProductsController(IRepository repo)
    {
        _repo = repo;
    }
}


В вышеприведенном коде интерфейс IRepository передается конструктору для ProductsController. Этот встроенный фреймворк для внедрения зависимостей в ASP.NET передает EFRepository к ProductsController, так как интерфейс IRepository был связан с EFRepository.

Кроме того, можно задействовать паттерн «Локатор служб». Всякий раз, когда существует возможность обратиться к HttpContext, вы можете получить доступ и к любым зарегистрированным службам. Например, можно извлечь EFRepository, применив следующий код вместо контроллера действий MVC:

var repo = this.Context.ApplicationServices.GetRequiredService<IRepository>();


9. xUnit.net

Прощай Visual Studio Unit Testing Framework, да здравствует xUnit.net!
В предыдущих версиях ASP.NET MVC для тестирования по умолчанию использовался фреймворк Visual Studio Unit Testing Framework (иногда называемый mstest). Для описания модульного теста в нем используются атрибуты [TestClass] и [TestMethod]:

[TestClass]
public class CalculatorTests {
 
    [TestMethod]
    public void TestAddNumbers() {
        // Условие
        var calc = new Calculator();
 
        // Действие
        var result = calc.AddNumbers(0, 0);
 
        // Результат
        Assert.AreEqual(0, result);
 
    }
 
}


В ASP.NET 5 для модульного тестирования используется фреймворк xUnit.net. В нем вместо [TestMethod] применяется атрибут [Fact], а атрибут [TestClass] отсутствует:

public class CalculatorTests
{
    [Fact]
    public void AddNumbers()
    {
        // Условие
        var calculator = new Calculator();
 
        // Действие
        var result = calculator.AddNumbers(1, 1);
 
        // Результат
        Assert.Equal(result, 13);
    }
}


Поработав с исходным кодом ASP.NET 5, вы убедитесь, что xUnit.net используется для обширного тестирования ASP.NET. Например, в репозитории MVC есть модульные тесты, написанные при помощи xUnit.net. С репозиторием MVC (и его модульными тестами) можно познакомиться здесь:

github.com/aspnet/mvc

В ASP.NET используется ответвление xUnit.net, расположенное здесь:
github.com/aspnet/xunit
Tags:
Hubs:
+25
Comments 24
Comments Comments 24

Articles

Information

Website
piter.com
Registered
Founded
Employees
201–500 employees
Location
Россия