43
Inversion of Control в .NET Дмитрий Кожевников Неизвестный банк [email protected] 9-я конференция .NET разработчиков 12 октября 2014 dotnetconf.ru

Inversion of Control в .NET

Embed Size (px)

Citation preview

Page 1: Inversion of Control в .NET

Inversion of Control в .NET

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

Неизвестный банк

[email protected]

9-я конференция .NET разработчиков

12 октября 2014

dotnetconf.ru

Page 2: Inversion of Control в .NET

2

Докладывает

• Кожевников Дмитрий

• .NET разработчик

• > 3 года enterprise разработки

• Информатизация ЖКХ

• Интеграция банковских систем

• Организация it-движухи

• Email [email protected]

Page 3: Inversion of Control в .NET

3

Enterprise разработка

Поколения разработчиков

Много legacy code

Много технических долгов

Тяжёлая поддержка

Page 4: Inversion of Control в .NET

4

Enterprise разработка

Page 5: Inversion of Control в .NET

5

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

Page 6: Inversion of Control в .NET

6

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

Page 7: Inversion of Control в .NET

7

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

Сложная композиция объектов

Связность и хрупкость связей

Page 8: Inversion of Control в .NET

8

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

• Детали зависят от абстракций

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

• Инвертирование зависимостей

Page 9: Inversion of Control в .NET

9

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

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

• Отделение интерфейса от реализации

Page 10: Inversion of Control в .NET

10

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

• Поставка зависимостей

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

Page 11: Inversion of Control в .NET

11

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

• Слабая связность

• Понятная сборка композиции

• Абстрактный код компилируется

• Ярко выраженные запахи кода

Page 12: Inversion of Control в .NET

12

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

Page 13: Inversion of Control в .NET

13

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

Page 14: Inversion of Control в .NET

14

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

Page 15: Inversion of Control в .NET

15

Раминь!

Page 16: Inversion of Control в .NET

16

Проблемы внедрения через

конструктор

• Вызовы конструкторов становятся слишком большими

• Неясно, когда остановиться и кому отдать ответственность за DI

Кто поможет?

Page 17: Inversion of Control в .NET

17

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

Page 18: Inversion of Control в .NET

18

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

Page 19: Inversion of Control в .NET

19

Resolve<T>()

Page 20: Inversion of Control в .NET

20

ServiceLocator

Page 21: Inversion of Control в .NET

21

Проблемы и ServiceLocator• Вызовы конструкторов становятся слишком большими

• Неясно, когда остановиться и кому отдать ответственность за DI

Page 22: Inversion of Control в .NET

22

ServiceLocator + Singleton

Page 23: Inversion of Control в .NET

23

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

Page 24: Inversion of Control в .NET

24

Ересь ServiceLocator

• Императивный

• Всемогущий

• Повышает связность

• Машина костылей

Page 25: Inversion of Control в .NET

25

Пример #1

Page 26: Inversion of Control в .NET

26

Пример #2

Page 27: Inversion of Control в .NET

27

Инверсия управления именем

Императора

• IoC как framework

• CompositionRoot

• Register-Resolve-Release

Page 28: Inversion of Control в .NET

28

Composition Root

Page 29: Inversion of Control в .NET

29

Register-Resolve-Release

Page 30: Inversion of Control в .NET

30

Инверсия управления как

framework• Один контейнер

• Единая композиция приложения

• Контейнер – глобальный сборщик

• Инверсия управления на полную

Page 31: Inversion of Control в .NET

31

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

Page 32: Inversion of Control в .NET

32

Почему IoC framework?

• Весь набор плюшек IoC

• Декларативная инфраструктура

• Интеграционное тестирование по уровням

• Отсутствие битых стёкол

• Размышления над дизайном

Page 33: Inversion of Control в .NET

33

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

Page 34: Inversion of Control в .NET

34

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

Page 35: Inversion of Control в .NET

35

Ссылки• Кулинария 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/

Page 36: Inversion of Control в .NET

36

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

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

Неизвестный банк

[email protected]

Page 37: Inversion of Control в .NET

37

Вообще без new?

string, int, double

Domain Entities

DTO

POCO

37

Page 38: Inversion of Control в .NET

38

Resolve вне CompositionRoot? Factory!

38

Page 39: Inversion of Control в .NET

39

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

39

Page 40: Inversion of Control в .NET

40

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

40

Page 41: Inversion of Control в .NET

41

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

41

Page 42: Inversion of Control в .NET

42

Core

Infrastructure

UI & API

External

IoС

Co

nta

iner

42

Page 43: Inversion of Control в .NET

43

Правда всё!

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

Неизвестный банк

[email protected]