Инъекция зависимости и Инверсия Контроля
TRANSCRIPT
![Page 1: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/1.jpg)
![Page 2: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/2.jpg)
Инъекция зависимос
ти
Владимир Игнатьев и Антон Катковспециально для Икспи-пати, Самара
![Page 3: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/3.jpg)
Злейшие враги ИксПи-джедая
1. Нетестируемый код
2. Сложная и хрупкая архитектура
3. Код, непригодный для повторного
использования
4. Вязкость (спагетти и копипаст)
![Page 4: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/4.jpg)
Проблематика: прямой вызов конструктора
Как не меняя код класса подменить PaypalCreditCardProcessor на фейк?
![Page 5: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/5.jpg)
Проблематика: использование Фабрики
Уже можно создать тест!Но зависимости сокрыты в коде ;-(
![Page 6: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/6.jpg)
Суть паттерна Инъекция Зависимости
• Зависимость передаётся в класс через
конструктор или через set-метод
• Ответственность за зависимость снимается с
класса (делегируется другому классу)
• Вообще класс поддерживает свои зависимости
только на уровне интерфейсов
• Модули верхнего уровня не зависят от модулей
нижнего уровня
![Page 7: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/7.jpg)
Пример кода с Инъекцией Зависимости
![Page 8: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/8.jpg)
Результат применения паттерна
• Теперь класс можно уединенно тестировать
• Мы можем переместить класс в другое
«окружение» и нам не надо будет менять в нём
ни строчки
• Иными словами, класс стал повторно
используемым, менее связанным с
«окружением»
![Page 9: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/9.jpg)
Ну и что? У нас теперь проблемы!
• Всё равно нужен класс, управляющий
зависимостями
• Прежде чем реализовать класс с помощью TDD,
нужно сначала написать фейки зависимостей
Так-то!
![Page 10: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/10.jpg)
К счастью, кэп не прав!
• Глобальный application-specific контроллер
зависимостей
• Автогенерация моков
• Фреймворк! Фреймворк! Фреймворк!
Фреймворк это добро.
![Page 11: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/11.jpg)
Почему фреймворк это добро?
• Фреймворк предоставляет Инъектор
• Задача Инъектора — заниматься
конструированием классов и «подтягиванием»
зависимостей
• Инъектор заменяет глобальный контроллер
• Фреймворки DI предоставляют возможность
выносить настройку Инъектора из кода
![Page 12: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/12.jpg)
Google Guice (Гугл джус)
• Прекрасно документированный минималистичный
фреймворк от Google
• Инъекция осуществляется через java-аннотации
• Внедрение как классов (beans), так и инстансов
• Инъекция провайдеров классов, создание своих
аннотаций инъекторов
• Разделение Инъекций для тестирования и для
продакшена
![Page 13: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/13.jpg)
Вот как он просто работает
![Page 14: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/14.jpg)
Что такое Binding?
• Binding это представление связи внутри Инъектора • Это объект, описывающий соответствие интерфейса зависимости конкретной его реализации
![Page 15: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/15.jpg)
Inversion of Control
• Ответственность за зависимости передаётся классу-контейнеру, который на основании схемы зависимостей между классами и абстракциями может создать граф объектов• IoC-контейнеры появились в Java, в Spring Framework• Фактически, IoC-контейнер — это объект, хранящий Binding’и• IoC используется на самых верхних слоях приложения, для инициализации объектов с учётом зависимостей
![Page 16: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/16.jpg)
Spring FrameworkПример Inversion Of Control
![Page 17: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/17.jpg)
Итоги применения DI/Ioc и особенности• Архитектурные решения имеют место для построения сервисных классов, осуществляющих связь с внешними системами, т.е. находятся в рамках только прикладной области• Упрощается архитектура, при этом архитектура приложения становится более гибкой, код становится повторно используемой, независимой от окружения
Не стоит• Применять только dependency injection в больших проектах: затрудняется понимание кода приложения, теряются преимущества использования• Осуществлять связывание с использованием только DI среди компонентов UI или внутри event-driven модели• Применять DI/IoC там, где зависимости реализуют аспекты
![Page 18: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/18.jpg)
Аспектно-ориентированное программирование и DI
• Аспект это особенность программы, которая не реализует непосредственно бизнес-логики, но является необходимой для отладки, тестирования, эксплуатации приложения — сквозная функциональность• DI это паттерн, который может быть использован для выделения «сквозной функциональности»• Примеры:1. Логирование2. Design by Contract (defensive development)
OO Testable Design и AOP
![Page 19: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/19.jpg)
Dependency Injection/IoC в event-driven и MVC системах
• Наряду с DI, разделение классов наряду с Dependency Injection, осуществляется Медиатором, транслирующим события • Инъектируется обработчик события• В MVC используется часто инъекция в контроллер, инъекция Модели в Представление
OO Testable Design и AOP
![Page 20: Инъекция зависимости и Инверсия Контроля](https://reader035.vdocuments.pub/reader035/viewer/2022062313/557ed287d8b42a706f8b5079/html5/thumbnails/20.jpg)
Спасибо.