Dependency Injection. Как сказать всё, не говоря ничего....
-
Upload
dev2devconf -
Category
Software
-
view
116 -
download
1
description
Transcript of Dependency Injection. Как сказать всё, не говоря ничего....
Dependency Injection.Как сказать всё, не
говоря ничегоКожевников Дмитрий
.NET
Докладывает
• Кожевников Дмитрий• .NET разработчик• > 3 года enterprise разработки • Информатизация ЖКХ• Интеграция банковских систем• Организация it-движухи• Email [email protected]
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
Core
Infrastructure
UI & API
External
IoС
Cont
aine
r
41
Правда всё!
42