Доброе утро, дорогие читатели.

Мы начнем неделю с такого информативного, пусть и несколько тезисного перевода, который поможет нам уточнить, насколько аудитория заинтересована в издании книг по 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

Комментарии (24)


  1. masterL
    08.06.2015 11:18

    Так вы бы опрос хотя бы создали. И вообще, о переводе какой книги идет речь? Так как литературы по ASP .Net 5 пока нет (а на английском она есть?) то книга в любом случае будет пользоваться популярностью.


    1. ph_piter Автор
      08.06.2015 12:35

      Допустим, речь идет о книге, охватывающей все эти темы, 600+ страниц, розничная цена около 1000 рублей


      1. Mandor
        08.06.2015 13:56
        +2

        Я бы купил.


      1. masterL
        08.06.2015 22:45

        Я как Asp .Net MVC разработчик могу сказать, что книга интересна. Особенно, потому что литературы по Asp .Net 5 нету. Наверно, все-таки веб-формы уходят в прошлое, поэтому изданные вами книги и не пользовались популярностью.


        1. TimeCoder
          09.06.2015 12:04

          Описываемый ASP MVC 6 — это синоним ASP vNext?


          1. masterL
            09.06.2015 12:34

            Я так понимаю, что да.


          1. Razaz
            09.06.2015 13:37

            Это официальное название. vNext — рабочее.


      1. ofigenn
        08.06.2015 23:02
        +1

        Если в ней также будет покрыта тема WebAPI, то будет интересно.


  1. LeX_KaR
    08.06.2015 11:21

    Спасибо за перевод! Я бы с удовольствием купил книгу — уж очень сочные обновления :)


  1. boostman
    08.06.2015 13:09
    +2

    А где 4-ый пункт?


    1. ph_piter Автор
      08.06.2015 13:26
      +1

      Извините, поправил.

      В оригинале еще был пункт об отказе от Visual Basic, но, как следует из примечания автора, этот пункт неактуален.
      Поэтому нумерация в переводе поползла


    1. rznELVIS
      08.06.2015 13:31

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


  1. BloodUnit
    08.06.2015 14:08
    +2

    Иногда хочется купить книгу, но отталкивает ужасный перевод, например в CLR via C# .NET 4.0.
    Если решите замахнуться, делайте качественно, пожалуйста.


    1. ph_piter Автор
      08.06.2015 14:13

      Хотелось бы узнать, что вы думаете о переводе книги

      CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#. 4-е изд


      1. BloodUnit
        08.06.2015 14:16

        Не видел эту книгу, но могу сказать, что CLR via C# .NET 2.0 переведен хорошо.


      1. DjoNIK
        08.06.2015 14:38

        Скорее всего, речь как раз о 3 издании. Здесь в UPD2 приведены ссылки на комментарии с выражением недовольства. О 4 издании точно сказать не могу, но по сравнению с 3 оно лучше (как минимум, исправлены опечатки в коде).


      1. JeStoneDev
        09.06.2015 05:27

        В целом перевод «CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#. 4-е изд» хороший. Единственное, что меня смутило, так это перевод слова Reflection на русский язык как «Отражения». Привык к переводу «Рефлексия», ну или на крайний случай вообще оставлять без перевода.


        1. ph_piter Автор
          09.06.2015 09:03

          Спасибо.

          С «рефлексией» как переводчик соглашусь, однако «отражение» в подобных контекстах постепенно превращалось в «рефлексию» прямо на моих глазах. Все-таки переводчики настороженно относятся к прямым заимствованиям, тем более, если в языке уже есть такой же заимствованный омоним.


  1. avvor
    08.06.2015 14:22

    Эх… по всему проекту придется переделывать субконтроллеры и Html.Action() на View Components((


    1. Kefir
      08.06.2015 14:42
      +3

      Там много чего помимо этого придется переделывать:)


  1. JeStoneDev
    09.06.2015 05:28
    +1

    Скажите, а в чем принципиальное преимущество xUnit.net над Visual Studio Unit Testing Framework?


  1. TimeCoder
    09.06.2015 13:04

    Очень хочу перейти из desktop в web-разработку на .net, реального опыта с ASP MVC пока нет, знаком лишь в теории. Описываемые здесь изменения выглядят весьма вкусно, хочется освоить это и работать — но смогу ли я найти вакансии с MVC 6? Или же реально проектов на нем еще долго не найти, и придется тянуть legacy, т.е. учить мне и старые версии MVC все равно (а заодно и WebForms)?


    1. Razaz
      09.06.2015 13:40
      +1

      Найдутся. Сейчас сидеть и не обновляться — чревато. Циклы разработки ускоряются, баки фиксятся только в следующих версиях. Бэкпортов нет. Мы вот уже на низком старте на переезд. Веб формы я очень давно в вакансиях не встречал. А там где встречал — обычно с них надо слезть на MVC. Опят MVC 5 будет полезен по любому, особенно в связке с OWIN.


  1. twirpx
    09.06.2015 13:41

    А как будет выглядеть output caching для view components?