Dependency Injection. Как сказать всё, не говоря ничего....

42
Dependency Injection. Как сказать всё, не говоря ничего Кожевников Дмитрий .NET

description

Inversion of Control и Dependecny Injection в .net по-прежнему нетривиальный квест и тренировка архитектурного мышления, несмотря на обилие публикаций по теме. Почему IoC контейнер это фреймворк и причём здесь кулинария? Как построить дизайн системы вокруг IoC контейнера и не прострелить себе ногу? Почему ServiceLocator это плохо и как без него обойтись? Как мы отвечали на эти вопросы и наступали на грабли внедрения зависимостей в масштабе приложения.

Transcript of Dependency Injection. Как сказать всё, не говоря ничего....

Page 1: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Dependency Injection.Как сказать всё, не

говоря ничегоКожевников Дмитрий

.NET

Page 2: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Докладывает

• Кожевников Дмитрий• .NET разработчик• > 3 года enterprise разработки • Информатизация ЖКХ• Интеграция банковских систем• Организация it-движухи• Email [email protected]

2

Page 3: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Enterprise разработка

• Поколения разработчиков• Много legacy code• Много технических долгов• Тяжёлая поддержка

3

Page 4: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Enterprise разработка

4

Page 5: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Сложным приложениям – гибкий дизайн

5

Page 6: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Разделение ответственности

6

Page 7: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Проблемы гибкого дизайна

• Сложная композиция объектов• Связность и хрупкость связей

7

Page 8: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Инверсия управления Inversion of Control

8

• Детали зависят от абстракций• Использование абстрактной инфраструктуры• Инвертирование зависимостей

Page 9: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

ЗависимостьDependency

• Предоставление инфраструктуры• Отделение интерфейса от реализации

9

Page 10: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Внедрение зависимостейDependency Injection

• Поставка зависимостей• Создание и конфигурация инфраструктуры

10

Page 11: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Как решаются проблемы

• Слабая связность• Понятная сборка композиции• Абстрактный код компилируется• Ярко выраженные запахи кода

11

Page 12: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Внедрение через конструкторConstructor Injection

12

Page 13: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Уровень абстракции

13

Page 14: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Макароны в конструкторах

14

Page 15: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Раминь!

15

Page 16: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Проблемы внедрения через конструктор• Вызовы конструкторов становятся слишком большими• Неясно, когда остановиться и кому отдать ответственность за DI

Кто поможет?

16

Page 17: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

IoC-контейнеры

17

Page 18: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Настройка контейнера

18

Page 19: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Resolve<T>()

19

Page 20: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

ServiceLocator

20

Page 21: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Проблемы и ServiceLocator

• Вызовы конструкторов становятся слишком большими• Неясно, когда остановиться и кому отдать ответственность за DI

21

Page 22: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

ServiceLocator + Singleton

22

Page 23: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

ServiceLocator это вундервафля

23

Page 24: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Ересь ServiceLocator

• Императивный• Всемогущий• Повышает связность• Машина костылей

24

Page 25: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Пример #1

25

Page 26: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Пример #2

26

Page 27: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Инверсия управления именем Императора• IoC как framework• CompositionRoot• Register-Resolve-Release

27

Page 28: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Composition Root

28

Page 29: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Register-Resolve-Release

29

Page 30: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Инверсия управления как framework• Один контейнер• Единая композиция приложения• Контейнер – глобальный сборщик• Инверсия управления на полную

30

Page 31: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Почему IoC framework?

• Весь набор плюшек IoC• Декларативная инфраструктура• Интеграционное тестирование по уровням• Отсутствие битых стёкол• Размышления над дизайном

31

Page 32: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Итог: сложность не нужна!

32

Page 33: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

33

Причём здесь кулинария?

Page 34: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Ссылки

• Кулинария http://www.ozon.ru/context/detail/id/22104901/• Модули http://

code.google.com/p/autofac/wiki/StructuringWithModules• CompositionRoot http://blog.ploeh.dk/2011/07/28/CompositionRoot

/• Register-Resolve-Release

http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasepattern/

34

Page 35: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

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

35

Page 36: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Вообще без new?

• string, int, double• Domain Entities• DTO• POCO

36

Page 37: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Resolve после CompositionRoot? Factory!

37

Page 38: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Несколько реализаций? #1

38

Page 39: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Несколько реализаций? #2

39

Page 40: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Несколько реализаций? #3

40

Page 41: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Core

Infrastructure

UI & API

External

IoС

Cont

aine

r

41

Page 42: Dependency Injection. Как сказать всё, не говоря ничего. Кожевников Дмитрий. Dev2Dev 24.08.2014

Правда всё!

42