Dependency Injection в ASP.NET
MVC и ASP.NET vNext
Давайте знакомиться
Андрей Лесков
Ведущий разработчик
andrey.leskov@gmail
2
Связной и ASP.Net MVC
Непростой бизнес
Большая инфраструктура
Скрывающее представление
Множестово правил
3
Последстивия для программиста
4
Dependency injection
5
SOLID
Dependency Inversion
Dependency injection ServiceLocator
Constructor injection
Property injection Method injection
DI в ASP.Net MVC
● Подача зависимостей контроллера извне
● Классический вариант - в конструктор
● Потребление готовых зависимости
● Зависимость от интерфейсов
6
Модель Register - Resolve
7
Interface Implementation
Container
ConsoleLoggerILogger
OrderServiceIService
DogIAnimal
IAnimal
Dog
Register Resolve
Общая схема DI в ASP.MVC
8
MvcHandler
IControllerFactory
Controller
Dependencies Resolve
Route
Dependencies RegisterAppStart
DI в коде
9
Dependencies Register
Dependencies Resolve
Controller
Как помогает DI при наведении порядка
● Структурирует код
● Упрощает контекст
● Повышает читаемость
● Разделяет на компоненты
10
Как мы представляем классы
DI повышает гранулярность
11
Service Locator как альтернатива
● Единое окно получения зависимостей
● Выдаёт любой тип
● Универсальная фабрика
12
Service Locator в коде. DependencyResolver.
13
Dependencies Register
Dependencies ResolveController
Почему нам больше подошёл DI
● Явное определение зависимостей
● Тестируемость
● Выявление запахов
● Не надо читать код для поиска зависимостей
14
Корень композиции
● место, где из компонентов собирается программа
● место, где настраивается контейнер
15
Настройка корня композиции
● конфигурируем в коде
● xml - конфигурация не всегда удобна
● deploy из-за изменения конфига
● анализируем случаи правки конфигураций
16
Общая схема DI в ASP.MVC
17
MvcHandler
IControllerFactory
Controller
MyControllerFactory
IDependecyResolver
Dependencies Resovle
DefaultControllerFactory
Dependencies Register
MyDependecyResolver
Route
AppStart
ReportGenerator
Пример: витрины данных
Controller
ReportFromCacheGenerator
Today Archive
DataMart
IReportGenerator
ReportGenerator
ReportBySourceGenerator
BusinessLogic
DataAccess
MultiSourceDataAccess
TodayDataAccess
ArchiveDataAccess
ReportPrepareService
18
Выгода от компоновки
● Простое переключение режимов витрин
● Переиспользование бизнес-логики
● Максимальное покрытие тестами
19
В чём ещё нам помог DI
● Простое переключение между контурами
разработки.
● Вынос настроек в БД, сохраняя тестируемость
● Выделение модулей системы
20
DI в ASP.Net vNext
● Единый ServiceLocator на весь технологический
стэк:
Routing
MVC
SignalR
EntityFramework
● Поддержка существуещего API для работы с DI
21
Пример: настройка контейнера vNext
public class Startup
{
public void Configure(IBuilder app)
{
app.UseServices(services =>
{
//Dependencies register
services.AddTransient<IMessageGenerator,HelloMessageGenerator>();
});
}
}
22
Свой контейнер в vNext
public void Configure(IBuilder app){
ServiceCollection services = new ServiceCollection();
services.Add(OptionsServices.GetDefaultServices());
#if NET45
Container container= new Container();
//configure
container.RegisterType<ILogger,Logger>();
app.ApplicationServices = container.Resolve<IServiceProvider>();
#else
services.AddTransient<IMessageGenerator,HelloMessageGenerator>();ap
p.ApplicationServices =
services.BuildServiceProvider(app.ApplicationServices);
#endif
23
Что можно сделать в vNext
24
● Передача IDbExecutionStrategy из Controller в EF
● Передача IDbInterceptor из Соntroller в EF
Сложности DI
● Тестирование контейнера
● Труднее менять конструкторы
● Больше проектирования
● Усиление протечек абстракций
25
Выгоды Cвязного от DI
● Ускорение разработки
● Ускорение отладки
● Меньше ошибок
● Толерантность к сложной бизнес-логике
26
Спасибо за внимание
Вопросы
Пример: витрины данных
Данные за
сегодня
Архив
Сайт
Витрина
данных
Отчёт
Модель
отчёта
Вычисления
(Долго)
Отображение
Сервис
Документ
(много
данных)
28

Внедрение зависимостей в ASP.NET MVС и ASP.NET vNext

  • 1.
    Dependency Injection вASP.NET MVC и ASP.NET vNext
  • 2.
  • 3.
    Связной и ASP.NetMVC Непростой бизнес Большая инфраструктура Скрывающее представление Множестово правил 3
  • 4.
  • 5.
    Dependency injection 5 SOLID Dependency Inversion Dependencyinjection ServiceLocator Constructor injection Property injection Method injection
  • 6.
    DI в ASP.NetMVC ● Подача зависимостей контроллера извне ● Классический вариант - в конструктор ● Потребление готовых зависимости ● Зависимость от интерфейсов 6
  • 7.
    Модель Register -Resolve 7 Interface Implementation Container ConsoleLoggerILogger OrderServiceIService DogIAnimal IAnimal Dog Register Resolve
  • 8.
    Общая схема DIв ASP.MVC 8 MvcHandler IControllerFactory Controller Dependencies Resolve Route Dependencies RegisterAppStart
  • 9.
    DI в коде 9 DependenciesRegister Dependencies Resolve Controller
  • 10.
    Как помогает DIпри наведении порядка ● Структурирует код ● Упрощает контекст ● Повышает читаемость ● Разделяет на компоненты 10
  • 11.
    Как мы представляемклассы DI повышает гранулярность 11
  • 12.
    Service Locator какальтернатива ● Единое окно получения зависимостей ● Выдаёт любой тип ● Универсальная фабрика 12
  • 13.
    Service Locator вкоде. DependencyResolver. 13 Dependencies Register Dependencies ResolveController
  • 14.
    Почему нам большеподошёл DI ● Явное определение зависимостей ● Тестируемость ● Выявление запахов ● Не надо читать код для поиска зависимостей 14
  • 15.
    Корень композиции ● место,где из компонентов собирается программа ● место, где настраивается контейнер 15
  • 16.
    Настройка корня композиции ●конфигурируем в коде ● xml - конфигурация не всегда удобна ● deploy из-за изменения конфига ● анализируем случаи правки конфигураций 16
  • 17.
    Общая схема DIв ASP.MVC 17 MvcHandler IControllerFactory Controller MyControllerFactory IDependecyResolver Dependencies Resovle DefaultControllerFactory Dependencies Register MyDependecyResolver Route AppStart
  • 18.
    ReportGenerator Пример: витрины данных Controller ReportFromCacheGenerator TodayArchive DataMart IReportGenerator ReportGenerator ReportBySourceGenerator BusinessLogic DataAccess MultiSourceDataAccess TodayDataAccess ArchiveDataAccess ReportPrepareService 18
  • 19.
    Выгода от компоновки ●Простое переключение режимов витрин ● Переиспользование бизнес-логики ● Максимальное покрытие тестами 19
  • 20.
    В чём ещёнам помог DI ● Простое переключение между контурами разработки. ● Вынос настроек в БД, сохраняя тестируемость ● Выделение модулей системы 20
  • 21.
    DI в ASP.NetvNext ● Единый ServiceLocator на весь технологический стэк: Routing MVC SignalR EntityFramework ● Поддержка существуещего API для работы с DI 21
  • 22.
    Пример: настройка контейнераvNext public class Startup { public void Configure(IBuilder app) { app.UseServices(services => { //Dependencies register services.AddTransient<IMessageGenerator,HelloMessageGenerator>(); }); } } 22
  • 23.
    Свой контейнер вvNext public void Configure(IBuilder app){ ServiceCollection services = new ServiceCollection(); services.Add(OptionsServices.GetDefaultServices()); #if NET45 Container container= new Container(); //configure container.RegisterType<ILogger,Logger>(); app.ApplicationServices = container.Resolve<IServiceProvider>(); #else services.AddTransient<IMessageGenerator,HelloMessageGenerator>();ap p.ApplicationServices = services.BuildServiceProvider(app.ApplicationServices); #endif 23
  • 24.
    Что можно сделатьв vNext 24 ● Передача IDbExecutionStrategy из Controller в EF ● Передача IDbInterceptor из Соntroller в EF
  • 25.
    Сложности DI ● Тестированиеконтейнера ● Труднее менять конструкторы ● Больше проектирования ● Усиление протечек абстракций 25
  • 26.
    Выгоды Cвязного отDI ● Ускорение разработки ● Ускорение отладки ● Меньше ошибок ● Толерантность к сложной бизнес-логике 26
  • 27.
  • 28.
    Пример: витрины данных Данныеза сегодня Архив Сайт Витрина данных Отчёт Модель отчёта Вычисления (Долго) Отображение Сервис Документ (много данных) 28