Upload
dotnetconf
View
336
Download
0
Embed Size (px)
Citation preview
Inversion of Control в .NET
Дмитрий Кожевников
Неизвестный банк
9-я конференция .NET разработчиков
12 октября 2014
dotnetconf.ru
2
Докладывает
• Кожевников Дмитрий
• .NET разработчик
• > 3 года enterprise разработки
• Информатизация ЖКХ
• Интеграция банковских систем
• Организация it-движухи
• Email [email protected]
3
Enterprise разработка
Поколения разработчиков
Много legacy code
Много технических долгов
Тяжёлая поддержка
4
Enterprise разработка
5
Сложным приложениям – гибкий дизайн
6
Разделение ответственности
7
Проблемы гибкого дизайна
Сложная композиция объектов
Связность и хрупкость связей
8
Инверсия управления Inversion of Control
• Детали зависят от абстракций
• Использование абстрактной инфраструктуры
• Инвертирование зависимостей
9
ЗависимостьDependency
• Предоставление инфраструктуры
• Отделение интерфейса от реализации
10
Внедрение зависимостейDependency Injection
• Поставка зависимостей
• Создание и конфигурация инфраструктуры
11
Как решаются проблемы
• Слабая связность
• Понятная сборка композиции
• Абстрактный код компилируется
• Ярко выраженные запахи кода
12
Внедрение через конструкторConstructor Injection
13
Уровень абстракции
14
Макароны в конструкторах
15
Раминь!
16
Проблемы внедрения через
конструктор
• Вызовы конструкторов становятся слишком большими
• Неясно, когда остановиться и кому отдать ответственность за DI
Кто поможет?
17
IoC-контейнеры
18
Настройка контейнера
19
Resolve<T>()
20
ServiceLocator
21
Проблемы и ServiceLocator• Вызовы конструкторов становятся слишком большими
• Неясно, когда остановиться и кому отдать ответственность за DI
22
ServiceLocator + Singleton
23
ServiceLocator это вундервафля
24
Ересь ServiceLocator
• Императивный
• Всемогущий
• Повышает связность
• Машина костылей
25
Пример #1
26
Пример #2
27
Инверсия управления именем
Императора
• IoC как framework
• CompositionRoot
• Register-Resolve-Release
28
Composition Root
29
Register-Resolve-Release
30
Инверсия управления как
framework• Один контейнер
• Единая композиция приложения
• Контейнер – глобальный сборщик
• Инверсия управления на полную
31
Внедрение через конструкторConstructor Injection
32
Почему IoC framework?
• Весь набор плюшек IoC
• Декларативная инфраструктура
• Интеграционное тестирование по уровням
• Отсутствие битых стёкол
• Размышления над дизайном
33
Итог: сложность не нужна!
34
Причём здесь кулинария?
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/
36
Спасибо за внимание
Дмитрий Кожевников
Неизвестный банк
37
Вообще без new?
string, int, double
Domain Entities
DTO
POCO
37
38
Resolve вне CompositionRoot? Factory!
38
39
Несколько реализаций? #1
39
40
Несколько реализаций? #2
40
41
Несколько реализаций? #3
41
42
Core
Infrastructure
UI & API
External
IoС
Co
nta
iner
42