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
Dog IAnimal
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