2. 2Управление зависимостями в коде
Обо мне
1. Владелец компании ByndyuSoft
2. Консультант по вопросам разработки приложений и
организации работы IT компаний
3. Внештатный сотрудник Академии АйТи
4. Технический блог http://blog.byndyu.ru
5. Преподаю в ЮУрГУ
6. Организую конференции .NET-разработчиков
http://www.dotnetconf.ru
7. Веду группу в Google Group по проблемам
разработки приложений
http://groups.google.com/dotnetconf
3. 3Управление зависимостями в коде
Исходный код примеров
https://github.com/AlexanderByndyu/dotnetco
nf/tree/master/IoC
4. 4Управление зависимостями в коде
1. Coupling и Cohesion
2. Принцип инверсии зависимостей
3. Применение DIP
4. Service Locator
5. IoC-контейнер
6. Абстрактные фабрики через контейнер
План
5. 5Управление зависимостями в коде
Coupling
(Dependency)
1. Связность – метрика,
характеризующая степень
зависимости классов друг от друга
2. Loosely coupled vs. Tightly coupled
3. Типы:
– Content coupling
– Common coupling
– Control coupling
– Data coupling
– Message coupling
Введение: Базовые понятия
6. 6Управление зависимостями в коде
Cohesion
1. Сцепленность –метрика, характеризующая на
сколько элементы модуля принадлежат друг другу
2. Low cohesion vs. High cohesion
3. Coupling ~ Cohesion
4. Типы:
– Coincidental cohesion (worst)
– Logical cohesion
– Temporal cohesion
– Procedural cohesion
– Communicational cohesion
– Sequential cohesion
– Functional cohesion (best)
Введение: Базовые понятия
7. 7Управление зависимостями в коде
Пример сильной связности
1 - OriginalProgram.sln
1. Компоненты без интерфейсов
2. Сильная связанность
3. Нарушение SRP
4. Нарушение OCP
5. Плохо тестируемые компоненты
8. 8Управление зависимостями в коде
Design for testability
1. Сильная связность затрудняет модульное
тестирование.
2. Работа внешними ресурсами затрудняет
тестирование компонентов.
Примеры внешних ресурсов:
• Обращения к сторонним сервисам
• Файловая система
• Файлы конфигурации
• Active Directory
• Web-Services
• ….
http://msdn.microsoft.com/en-us/magazine/dd263069.aspx
9. 9Управление зависимостями в коде
Принципыпроектированияклассов
Модули верхнего уровня не должны зависеть
от модулей нижнего уровня. Оба должны
зависеть от абстракции
Абстракции не должны зависеть от деталей.
Детали должны зависеть от абстракции
Реализация принципа:
Plugin, Factory, Service Locator,
Inversion of Control, Dependency Injection
Dependency Inversion Principle
11. 11Управление зависимостями в коде
Типы зависимостей
1. Stable Dependencies
1. Домен приложения
2. Классы, которые не будут изменены (Program,
Global.asax, …)
3. Сервисы, которые не будут меняться
(не обманывайте себя, они обязательно будут)
2. Volatile Dependencies
1. Сервисы в приложении
2. Внешние библиотеки
3. Работа с внешней инфраструктурой
4. DateTime?
12. 12Управление зависимостями в коде
Service Locator
3 - ApplyIoCProgram.sln
Изначальный вариант
Выделяем конфигурирование зависимости
15. 15Управление зависимостями в коде
IoC-контейнеры в .NET
• Castle Windsor
http://www.castleproject.org/container/index.html
• Unity (Microsoft P&P)
http://unity.codeplex.com
• Ninject
http://ninject.org
16. 16Управление зависимостями в коде
Плюсы от DI
1. Late binding
Сервисы могут быть заменены другими сервисами
2. Extensibility
Код может быть расширен и легко повторно использован
3. Parallel development
Разработка кода с низкой связностью упрощает работу в
параллели
4. Maintainability
Классы с четкими границами ответственности легко
сопровождать
5. Testability
Модули могут быть протестированы
17. 17Управление зависимостями в коде
Абстрактная приабстрактная
фабрика
Пример реального использования:
https://github.com/AlexanderByndyu/ByndyuSoft.Infrastructure/tree/master/source/I
nfrastructure.Domain/Commands
5 - AbstractFactoryProgram.sln
18. 18Управление зависимостями в коде
Service Lifestyle
1. Singleton
2. Transient
3. PerWebRequest
4. PerThread
5. …
19. 19Управление зависимостями в коде
Обертка над IoC-контейнером
Используем Adapter, чтобы не
привязываться к конкретному
IoC-контейнеру
20. 20Управление зависимостями в коде
Ссылки
• Видео Управление зависимостями в коде
• Статья Принцип инверсии зависимости
• Книга Dependency Injection in .NET
21. 21Управление зависимостями в коде
Спасибо за внимание!
Буду рад ответить на ваши
вопросы лично или через:
blog.byndyu.ru
alexanderbyndyu
alexander.byndyu@gmail.com