Инъекция зависимости и Инверсия Контроля
-
Upload
vladimir-ignatev -
Category
Technology
-
view
3.375 -
download
2
Transcript of Инъекция зависимости и Инверсия Контроля
Инъекция зависимос
ти
Владимир Игнатьев и Антон Катковспециально для Икспи-пати, Самара
Злейшие враги ИксПи-джедая
1. Нетестируемый код
2. Сложная и хрупкая архитектура
3. Код, непригодный для повторного
использования
4. Вязкость (спагетти и копипаст)
Проблематика: прямой вызов конструктора
Как не меняя код класса подменить PaypalCreditCardProcessor на фейк?
Проблематика: использование Фабрики
Уже можно создать тест!Но зависимости сокрыты в коде ;-(
Суть паттерна Инъекция Зависимости
• Зависимость передаётся в класс через
конструктор или через set-метод
• Ответственность за зависимость снимается с
класса (делегируется другому классу)
• Вообще класс поддерживает свои зависимости
только на уровне интерфейсов
• Модули верхнего уровня не зависят от модулей
нижнего уровня
Пример кода с Инъекцией Зависимости
Результат применения паттерна
• Теперь класс можно уединенно тестировать
• Мы можем переместить класс в другое
«окружение» и нам не надо будет менять в нём
ни строчки
• Иными словами, класс стал повторно
используемым, менее связанным с
«окружением»
Ну и что? У нас теперь проблемы!
• Всё равно нужен класс, управляющий
зависимостями
• Прежде чем реализовать класс с помощью TDD,
нужно сначала написать фейки зависимостей
Так-то!
К счастью, кэп не прав!
• Глобальный application-specific контроллер
зависимостей
• Автогенерация моков
• Фреймворк! Фреймворк! Фреймворк!
Фреймворк это добро.
Почему фреймворк это добро?
• Фреймворк предоставляет Инъектор
• Задача Инъектора — заниматься
конструированием классов и «подтягиванием»
зависимостей
• Инъектор заменяет глобальный контроллер
• Фреймворки DI предоставляют возможность
выносить настройку Инъектора из кода
Google Guice (Гугл джус)
• Прекрасно документированный минималистичный
фреймворк от Google
• Инъекция осуществляется через java-аннотации
• Внедрение как классов (beans), так и инстансов
• Инъекция провайдеров классов, создание своих
аннотаций инъекторов
• Разделение Инъекций для тестирования и для
продакшена
Вот как он просто работает
Что такое Binding?
• Binding это представление связи внутри Инъектора • Это объект, описывающий соответствие интерфейса зависимости конкретной его реализации
Inversion of Control
• Ответственность за зависимости передаётся классу-контейнеру, который на основании схемы зависимостей между классами и абстракциями может создать граф объектов• IoC-контейнеры появились в Java, в Spring Framework• Фактически, IoC-контейнер — это объект, хранящий Binding’и• IoC используется на самых верхних слоях приложения, для инициализации объектов с учётом зависимостей
Spring FrameworkПример Inversion Of Control
Итоги применения DI/Ioc и особенности• Архитектурные решения имеют место для построения сервисных классов, осуществляющих связь с внешними системами, т.е. находятся в рамках только прикладной области• Упрощается архитектура, при этом архитектура приложения становится более гибкой, код становится повторно используемой, независимой от окружения
Не стоит• Применять только dependency injection в больших проектах: затрудняется понимание кода приложения, теряются преимущества использования• Осуществлять связывание с использованием только DI среди компонентов UI или внутри event-driven модели• Применять DI/IoC там, где зависимости реализуют аспекты
Аспектно-ориентированное программирование и DI
• Аспект это особенность программы, которая не реализует непосредственно бизнес-логики, но является необходимой для отладки, тестирования, эксплуатации приложения — сквозная функциональность• DI это паттерн, который может быть использован для выделения «сквозной функциональности»• Примеры:1. Логирование2. Design by Contract (defensive development)
OO Testable Design и AOP
Dependency Injection/IoC в event-driven и MVC системах
• Наряду с DI, разделение классов наряду с Dependency Injection, осуществляется Медиатором, транслирующим события • Инъектируется обработчик события• В MVC используется часто инъекция в контроллер, инъекция Модели в Представление
OO Testable Design и AOP
Спасибо.