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

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