Внедрение зависимостей в asp.net mvС и asp.net vnext

28
Dependency Injection в ASP.NET MVC и ASP.NET vNext

Upload: gosharp

Post on 20-Jul-2015

454 views

Category:

Technology


1 download

TRANSCRIPT

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

Dependency Injection в ASP.NET MVC и ASP.NET vNext

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

Давайте знакомиться

Андрей Лесков

Ведущий разработчик

andrey.leskov@gmail

2

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

Связной и ASP.Net MVC

Непростой бизнес

Большая инфраструктура

Скрывающее представление

Множестово правил

3

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

Последстивия для программиста

4

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

Dependency injection

5

SOLID

Dependency Inversion

Dependency injection ServiceLocator

Constructor injection

Property injection Method injection

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

DI в ASP.Net MVC

● Подача зависимостей контроллера извне

● Классический вариант - в конструктор

● Потребление готовых зависимости

● Зависимость от интерфейсов

6

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

Модель Register - Resolve

7

Interface Implementation

Container

ConsoleLoggerILogger

OrderServiceIService

Dog IAnimal

IAnimal

Dog

Register Resolve

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

Общая схема DI в ASP.MVC

8

MvcHandler

IControllerFactory

Controller

Dependencies Resolve

Route

Dependencies RegisterAppStart

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

DI в коде

9

Dependencies Register

Dependencies Resolve

Controller

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

Как помогает DI при наведении порядка

● Структурирует код

● Упрощает контекст

● Повышает читаемость

● Разделяет на компоненты

10

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

Как мы представляем классы

DI повышает гранулярность

11

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

Service Locator как альтернатива

● Единое окно получения зависимостей

● Выдаёт любой тип

● Универсальная фабрика

12

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

Service Locator в коде. DependencyResolver.

13

Dependencies Register

Dependencies ResolveController

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

Почему нам больше подошёл DI

● Явное определение зависимостей

● Тестируемость

● Выявление запахов

● Не надо читать код для поиска зависимостей

14

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

Корень композиции

● место, где из компонентов собирается программа

● место, где настраивается контейнер

15

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

Настройка корня композиции

● конфигурируем в коде

● xml - конфигурация не всегда удобна

● deploy из-за изменения конфига

● анализируем случаи правки конфигураций

16

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

Общая схема DI в ASP.MVC

17

MvcHandler

IControllerFactory

Controller

MyControllerFactory

IDependecyResolver

Dependencies Resovle

DefaultControllerFactory

Dependencies Register

MyDependecyResolver

Route AppStart

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

ReportGenerator

Пример: витрины данных

Controller

ReportFromCacheGenerator

Today Archive

DataMart

IReportGenerator

ReportGenerator

ReportBySourceGenerator

BusinessLogic

DataAccess

MultiSourceDataAccess

TodayDataAccess

ArchiveDataAccess

ReportPrepareService

18

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

Выгода от компоновки

● Простое переключение режимов витрин

● Переиспользование бизнес-логики

● Максимальное покрытие тестами

19

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

В чём ещё нам помог DI

● Простое переключение между контурами

разработки.

● Вынос настроек в БД, сохраняя тестируемость

● Выделение модулей системы

20

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

DI в ASP.Net vNext

● Единый ServiceLocator на весь технологический

стэк:

Routing

MVC

SignalR

EntityFramework

● Поддержка существуещего API для работы с DI

21

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

Пример: настройка контейнера vNext

public class Startup

{

public void Configure(IBuilder app)

{

app.UseServices(services =>

{

//Dependencies register

services.AddTransient<IMessageGenerator,HelloMessageGenerator>();

});

}

}

22

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

Свой контейнер в 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

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

Что можно сделать в vNext

24

● Передача IDbExecutionStrategy из Controller в EF

● Передача IDbInterceptor из Соntroller в EF

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

Сложности DI

● Тестирование контейнера

● Труднее менять конструкторы

● Больше проектирования

● Усиление протечек абстракций

25

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

Выгоды Cвязного от DI

● Ускорение разработки

● Ускорение отладки

● Меньше ошибок

● Толерантность к сложной бизнес-логике

26

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

Спасибо за внимание

Вопросы

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

Пример: витрины данных

Данные за сегодня

АрхивСайт

Витрина данных

Отчёт

Модель отчёта

Вычисления(Долго)

Отображение

Сервис

Документ (много данных)

28