Эволюция управления зависимостями в коде

Эволюция управления зависимостями в коде

89a0966b0f29e90ebf602a77e1349a6b?s=128

Alexander Byndyu

June 23, 2013
Tweet

Transcript

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

    .NET разработчиков 28 апреля 2013 www.dotnetconf.ru
  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 -

    Original\Program.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
  10. 10 Управление зависимостями в коде Пример применения DIP 2 -

    ApplyDIP\Program.sln
  11. 11 Управление зависимостями в коде Типы зависимостей 1. Stable Dependencies

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

    Изначальный вариант Выделяем конфигурирование зависимости
  13. 13 Управление зависимостями в коде Dependency Injection • Constructor Injection

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

    Apply Ninject\Program.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 - AbstractFactory\Program.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