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

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

Jun 14, 2015

Download

Software

dev2devConf

Inversion of Control и Dependecny Injection в .net по-прежнему нетривиальный квест и тренировка архитектурного мышления, несмотря на обилие публикаций по теме. Почему IoC контейнер это фреймворк и причём здесь кулинария? Как построить дизайн системы вокруг IoC контейнера и не прострелить себе ногу? Почему ServiceLocator это плохо и как без него обойтись? Как мы отвечали на эти вопросы и наступали на грабли внедрения зависимостей в масштабе приложения.
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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