Slide 1

Slide 1 text

Управление зависимостями в коде Александр Бындю ByndyuSoft http://www.byndyu.ru 6-я конференция .NET разработчиков 28 апреля 2013 www.dotnetconf.ru

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

3 Управление зависимостями в коде Исходный код примеров https://github.com/AlexanderByndyu/dotnetco nf/tree/master/IoC

Slide 4

Slide 4 text

4 Управление зависимостями в коде 1. Coupling и Cohesion 2. Принцип инверсии зависимостей 3. Применение DIP 4. Service Locator 5. IoC-контейнер 6. Абстрактные фабрики через контейнер План

Slide 5

Slide 5 text

5 Управление зависимостями в коде Coupling (Dependency) 1. Связность – метрика, характеризующая степень зависимости классов друг от друга 2. Loosely coupled vs. Tightly coupled 3. Типы: – Content coupling – Common coupling – Control coupling – Data coupling – Message coupling Введение: Базовые понятия

Slide 6

Slide 6 text

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) Введение: Базовые понятия

Slide 7

Slide 7 text

7 Управление зависимостями в коде Пример сильной связности 1 - Original\Program.sln 1. Компоненты без интерфейсов 2. Сильная связанность 3. Нарушение SRP 4. Нарушение OCP 5. Плохо тестируемые компоненты

Slide 8

Slide 8 text

8 Управление зависимостями в коде Design for testability 1. Сильная связность затрудняет модульное тестирование. 2. Работа внешними ресурсами затрудняет тестирование компонентов. Примеры внешних ресурсов: • Обращения к сторонним сервисам • Файловая система • Файлы конфигурации • Active Directory • Web-Services • …. http://msdn.microsoft.com/en-us/magazine/dd263069.aspx

Slide 9

Slide 9 text

9 Управление зависимостями в коде Принципы проектирования классов Модули верхнего уровня не должны зависеть от модулей нижнего уровня. Оба должны зависеть от абстракции Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракции Реализация принципа: Plugin, Factory, Service Locator, Inversion of Control, Dependency Injection Dependency Inversion Principle

Slide 10

Slide 10 text

10 Управление зависимостями в коде Пример применения DIP 2 - ApplyDIP\Program.sln

Slide 11

Slide 11 text

11 Управление зависимостями в коде Типы зависимостей 1. Stable Dependencies 1. Домен приложения 2. Классы, которые не будут изменены (Program, Global.asax, …) 3. Сервисы, которые не будут меняться (не обманывайте себя, они обязательно будут) 2. Volatile Dependencies 1. Сервисы в приложении 2. Внешние библиотеки 3. Работа с внешней инфраструктурой 4. DateTime?

Slide 12

Slide 12 text

12 Управление зависимостями в коде Service Locator 3 - ApplyIoC\Program.sln Изначальный вариант Выделяем конфигурирование зависимости

Slide 13

Slide 13 text

13 Управление зависимостями в коде Dependency Injection • Constructor Injection • «Всегда» инициализированный • Хорошая видимость зависимости • Скрывание сеттеров • Setter Injection • Компонент пассивный • Кто-то выставляет зависимость

Slide 14

Slide 14 text

14 Управление зависимостями в коде Пример использования IoC 4 - Apply Ninject\Program.sln

Slide 15

Slide 15 text

15 Управление зависимостями в коде IoC-контейнеры в .NET • Castle Windsor http://www.castleproject.org/container/index.html • Unity (Microsoft P&P) http://unity.codeplex.com • Ninject http://ninject.org

Slide 16

Slide 16 text

16 Управление зависимостями в коде Плюсы от DI 1. Late binding Сервисы могут быть заменены другими сервисами 2. Extensibility Код может быть расширен и легко повторно использован 3. Parallel development Разработка кода с низкой связностью упрощает работу в параллели 4. Maintainability Классы с четкими границами ответственности легко сопровождать 5. Testability Модули могут быть протестированы

Slide 17

Slide 17 text

17 Управление зависимостями в коде Абстрактная приабстрактная фабрика Пример реального использования: https://github.com/AlexanderByndyu/ByndyuSoft.Infrastructure/tree/master/source/I nfrastructure.Domain/Commands 5 - AbstractFactory\Program.sln

Slide 18

Slide 18 text

18 Управление зависимостями в коде Service Lifestyle 1. Singleton 2. Transient 3. PerWebRequest 4. PerThread 5. …

Slide 19

Slide 19 text

19 Управление зависимостями в коде Обертка над IoC-контейнером Используем Adapter, чтобы не привязываться к конкретному IoC-контейнеру

Slide 20

Slide 20 text

20 Управление зависимостями в коде Ссылки • Видео Управление зависимостями в коде • Статья Принцип инверсии зависимости • Книга Dependency Injection in .NET

Slide 21

Slide 21 text

21 Управление зависимостями в коде Спасибо за внимание! Буду рад ответить на ваши вопросы лично или через: blog.byndyu.ru alexanderbyndyu [email protected]