Готовим Asp.net5, Релиз №3 — Внедрение Зависимостей По-Новому

Продолжаем нашу рубрику на тему ASP.NET5 публикацией Виктора Коцюбана ( Гбдрм ) — Технический руководитель SoftServe. В этой статье Виктор поделится с вами подробностями о новой встроенной функции внедрения зависимостей в ASP.NET5. Предыдущие статьи рубрики всегда можно прочитать по ссылке.

#aspnetcolumn — Владимир Юнев Внедрение зависимостей — одна из самых популярных и используемых форм инверсии управления, важный принцип ООП, позволяющий уменьшить связанность — взаимозависимость, взаимосвязанность модулей.



Готовим ASP.NET5, релиз №3 — внедрение зависимостей по-новому

Во многих современных фреймворках внедрение зависимостей уже является частью самого фреймворка.

Это большой плюс, поскольку у разработчиков есть встроенная возможность создавать компоненты, разрешать зависимости и предоставлять их другим компонентам по запросу, и это происходит внутри самой программной платформы.

Кроме того, внедрение зависимостей — один из основных принципов работы с платформой, незнание которого может привести к неэффективному использованию фреймворка и написанию хренового кода.

ASP.NET 5 имеет встроенную систему внедрения зависимостей.

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

Мы также постараемся использовать это на практике.

ASP.NET 5 находится в стадии бета-тестирования, и все описанное здесь может измениться до выхода финальной версии.

Например, не так давно произошли серьезные изменения в возможностях встраивания в свойства.

Но основная концепция и основные направления этого нововведения уже ясны.



Основы и регистрация услуг

Большинство необходимых вам зависимостей предназначены для представлений, контроллеров и т. д., реализованных как сервисы, поэтому сервис — это минимальная единица, которой управляет контейнер DI. Ключевые функции минималистичного контейнера ASP.NET 5 включены в интерфейс IServiceProvider. Единственным методом этого интерфейса является объект GetService(Type serviceType).

Контейнер поддерживает 4 типа инициализации службы (4 типа области действия):

  1. Экземпляр – возвращается конкретный объект, за создание которого вы несете ответственность.

  2. Transient – каждый раз возвращается новый объект.
  3. Синглтон — всегда возвращает один и тот же объект.
  4. Scoped — эквивалент сиглетона, но в заданной области (например, в области запроса).

Регистрация сервисов осуществляется при старте приложения, в классе Startup, с помощью метода ConfigurationServices(IServiceCollection Services), а также в ServiceCollection имеются методы добавления сервиса с соответствующей областью действия (рис.

1).



Готовим ASP.NET5, релиз №3 — внедрение зависимостей по-новому

Рисунок 1. — Диаграмма классов Пример использования методов расширения ServiceCollection:

  
  
   

public virtual void ConfigureServices(IServiceCollection services) { var settings = new Settings(); services.AddInstance(settings); services.AddScoped<IProductService, ProductService>(); services.AddSingleton<TestService>(); }

После регистрации сервисы доступны во всех классах, которые вызывались через DI, а также доступные в представлениях.



Реализация сервисов в контроллере

С реализацией в контроллерах все очень просто — происходит через конструктор контроллера.



public class HomeController : Controller { private readonly IApplicationEnvironment _appEnvironment; private readonly IProductService _productService; public HomeController(IProductService productService, IApplicationEnvironment appEnvironment) { _appEnvironment = appEnvironment; _productService = productService; } // .

}

И больше ничего делать не нужно.

Зарегистрированные службы доступны как параметры конструктора.

Если мы используем EntityFramework в нашем приложении, то одной из первых зависимостей, о которых мы подумаем использовать DI, является DbContext. Это позволит нам писать код менее зависимый от DbContext, будет проще тестировать такой функционал и т.д. Пример: github.com/gbdrm/aspnet5/blob/master/src/aspnet5/Controllers/HomeController.cs#L12-L17

Встраивание в представления

Также есть интересная возможность использования зарегистрированных сервисов в представлениях (*.

cshtml).



@model SomeViewModel @inject SomeContext SomeContext <h1>@SomeContext.PageTitle</h1> <!-- HTML -->

Директива @inject сообщает механизму представления, что мы хотим использовать сервис SomeContext. А в самом представлении уже можно использовать этот сервис, в данном случае свойство PageTitle. Помимо использования сервисов в представлениях, еще одним интересным нововведением являются типизированные настройки.

Помимо регистрации сервисов, есть возможность «прописать» часть конфигурации, предварительно приведя эту конфигурацию к определенному типу, и сделать это можно всего за несколько строк кода.

Пример реализации типизированной конфигурации в представлении: github.com/gbdrm/aspnet5/commit/88dc1e708f89edfd30a55ae90265cde9074ae312

Внедрение в свойства и куда делся [Активировать]?

Раньше с помощью атрибута [Активировать] можно было вытащить соответствующую услугу для свойства.

Но разработчики решили отказаться от этого.

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

Об этом уже давно ведутся дискуссии, подробности можно прочитать здесь: github.com/aspnet/Mvc/issues/2151 , github.com/aspnet/Announcements/issues/28 Но все же остается возможность внедрения зависимостей через свойства — с помощью атрибута [FromServices].

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

github.com/gbdrm/aspnet5/commit/3d09ef0c5b6d079884337a6e044262659a4f6250

Заключение

Внедрение зависимостей на уровне платформы — отличный механизм для унификации управления зависимостями.

Реализация в ASP.NET 5 прозрачна и понятна, а настройка очень проста.

Несмотря на то, что реализация все еще находится в стадии бета-тестирования, большая часть функционала уже стабильна и готова к полноценной разработке.

Все исходные коды контейнеров доступны на GitHub – github.com/aspnet/DependencyInjection .

Работа еще продолжается, вы можете ознакомиться не только с функционалом, но и посмотреть, как создается часть платформы.

Если вы хотите узнать больше о внедрении зависимостей в asp.net 5, есть отличная статья (на английском языке): www.emadashi.com/2015/06/dependent-injection-in-asp-net-5-one-step-deeper .



Готовим ASP.NET5, релиз №3 — внедрение зависимостей по-новому

Совет! А еще, если вас заинтересовала тема ASP.NET5, вы можете посмотреть примеры, попробовать что-то добавить самостоятельно или написать запрос на реализацию какого-то функционала в проекте с примерами: github.com/gbdrm/aspnet5


Последние новости

Как вы уже знаете, Visual Studio 2015 была выпущена с ASP.NET5 Beta5. Подробности о том, что именно включено в выпуск Visual Studio, можно найти в этот блог .

Выпущено обновление ASP.NET5 Beta6 со множеством изменений, улучшений и исправлений ошибок.

Подробности обновления можно найти в этом блоге .

Вы можете скачать обновление перейдите по этой ссылке .

Опубликовано планы выпустить версии платформы в ближайшие месяцы, пока не будет выпущена финальная версия ASP.NET5. По их словам, нас ждут версии Beta7 и Beta8, после чего в ноябре мы получим первую готовую к производству версию (RC1), финальная версия выйдет в первом квартале 2016 года.

Подробности о каждой версии можно узнать здесь.

связь .

Опубликованные отчеты Конференция DevCon 2015, включая веб-разработку и Тема ASP.NET .



Полезные ссылки

Последняя версия документации ASP.NET5 находится по адресу http://docs.asp.net/en/latest/ .

Приглашаем вас настроиться на прямые трансляции периодического шоу Стенд сообщества ASP.NET 5 , где разработчики из команды Microsoft делятся последними новостями о платформе.

Доступные записи перейдите по этой ссылке .

Ознакомьтесь с новой статьей о разработке приложений ASP.NET в Visual Studio Code Рика Рейтана, в котором подробно описаны интересные аспекты работы с веб-проектами в VS Code. Изучите основы ASP.NET5 с помощью новый бесплатный курс Виртуальная академия Microsoft.

Авторам

Друзья, если вы заинтересованы поддержать рубрику собственным материалом, пишите мне на почту [email protected] чтобы обсудить все детали.

Мы ищем авторов, которые смогут интересно рассказать об ASP.NET и других темах.



Готовим ASP.NET5, релиз №3 — внедрение зависимостей по-новому



об авторе

Коцюбан Виктор Технический руководитель SoftServe Гбдрм .

NET-разработчик с опытом работы более 8 лет. Специалист в области корпоративных веб-проектов.

Последние 4 года занимал должность технического руководителя.

В опросе могут участвовать только зарегистрированные пользователи.

Войти , Пожалуйста.

Будете ли вы использовать встроенный механизм внедрения зависимостей? 66,86% В большинстве случаев - да 113 8,88% В редких случаях 15 24,26% Скорее всего - нет, пользуюсь сторонним 41 Проголосовали 169 пользователей.

37 пользователей воздержались.

Теги: #Разработка веб-сайтов #.

NET #Visual Studio #внедрение зависимостей #ASP.NET #ASP #ASP #внедрение зависимостей ##aspnetcolumn ##aspnetcolumn #asp.net 5

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.