Transcript
Page 1: Инъекция зависимости и Инверсия Контроля
Page 2: Инъекция зависимости и Инверсия Контроля

Инъекция зависимос

ти

Владимир Игнатьев и Антон Катковспециально для Икспи-пати, Самара

Page 3: Инъекция зависимости и Инверсия Контроля

Злейшие враги ИксПи-джедая

1. Нетестируемый код

2. Сложная и хрупкая архитектура

3. Код, непригодный для повторного

использования

4. Вязкость (спагетти и копипаст)

Page 4: Инъекция зависимости и Инверсия Контроля

Проблематика: прямой вызов конструктора

Как не меняя код класса подменить PaypalCreditCardProcessor на фейк?

Page 5: Инъекция зависимости и Инверсия Контроля

Проблематика: использование Фабрики

Уже можно создать тест!Но зависимости сокрыты в коде ;-(

Page 6: Инъекция зависимости и Инверсия Контроля

Суть паттерна Инъекция Зависимости

• Зависимость передаётся в класс через

конструктор или через set-метод

• Ответственность за зависимость снимается с

класса (делегируется другому классу)

• Вообще класс поддерживает свои зависимости

только на уровне интерфейсов

• Модули верхнего уровня не зависят от модулей

нижнего уровня

Page 7: Инъекция зависимости и Инверсия Контроля

Пример кода с Инъекцией Зависимости

Page 8: Инъекция зависимости и Инверсия Контроля

Результат применения паттерна

• Теперь класс можно уединенно тестировать

• Мы можем переместить класс в другое

«окружение» и нам не надо будет менять в нём

ни строчки

• Иными словами, класс стал повторно

используемым, менее связанным с

«окружением»

Page 9: Инъекция зависимости и Инверсия Контроля

Ну и что? У нас теперь проблемы!

• Всё равно нужен класс, управляющий

зависимостями

• Прежде чем реализовать класс с помощью TDD,

нужно сначала написать фейки зависимостей

Так-то!

Page 10: Инъекция зависимости и Инверсия Контроля

К счастью, кэп не прав!

• Глобальный application-specific контроллер

зависимостей

• Автогенерация моков

• Фреймворк! Фреймворк! Фреймворк!

Фреймворк это добро.

Page 11: Инъекция зависимости и Инверсия Контроля

Почему фреймворк это добро?

• Фреймворк предоставляет Инъектор

• Задача Инъектора — заниматься

конструированием классов и «подтягиванием»

зависимостей

• Инъектор заменяет глобальный контроллер

• Фреймворки DI предоставляют возможность

выносить настройку Инъектора из кода

Page 12: Инъекция зависимости и Инверсия Контроля

Google Guice (Гугл джус)

• Прекрасно документированный минималистичный

фреймворк от Google

• Инъекция осуществляется через java-аннотации

• Внедрение как классов (beans), так и инстансов

• Инъекция провайдеров классов, создание своих

аннотаций инъекторов

• Разделение Инъекций для тестирования и для

продакшена

Page 13: Инъекция зависимости и Инверсия Контроля

Вот как он просто работает

Page 14: Инъекция зависимости и Инверсия Контроля

Что такое Binding?

• Binding это представление связи внутри Инъектора • Это объект, описывающий соответствие интерфейса зависимости конкретной его реализации

Page 15: Инъекция зависимости и Инверсия Контроля

Inversion of Control

• Ответственность за зависимости передаётся классу-контейнеру, который на основании схемы зависимостей между классами и абстракциями может создать граф объектов• IoC-контейнеры появились в Java, в Spring Framework• Фактически, IoC-контейнер — это объект, хранящий Binding’и• IoC используется на самых верхних слоях приложения, для инициализации объектов с учётом зависимостей

Page 16: Инъекция зависимости и Инверсия Контроля

Spring FrameworkПример Inversion Of Control

Page 17: Инъекция зависимости и Инверсия Контроля

Итоги применения DI/Ioc и особенности• Архитектурные решения имеют место для построения сервисных классов, осуществляющих связь с внешними системами, т.е. находятся в рамках только прикладной области• Упрощается архитектура, при этом архитектура приложения становится более гибкой, код становится повторно используемой, независимой от окружения

Не стоит• Применять только dependency injection в больших проектах: затрудняется понимание кода приложения, теряются преимущества использования• Осуществлять связывание с использованием только DI среди компонентов UI или внутри event-driven модели• Применять DI/IoC там, где зависимости реализуют аспекты

Page 18: Инъекция зависимости и Инверсия Контроля

Аспектно-ориентированное программирование и DI

• Аспект это особенность программы, которая не реализует непосредственно бизнес-логики, но является необходимой для отладки, тестирования, эксплуатации приложения — сквозная функциональность• DI это паттерн, который может быть использован для выделения «сквозной функциональности»• Примеры:1. Логирование2. Design by Contract (defensive development)

OO Testable Design и AOP

Page 19: Инъекция зависимости и Инверсия Контроля

Dependency Injection/IoC в event-driven и MVC системах

• Наряду с DI, разделение классов наряду с Dependency Injection, осуществляется Медиатором, транслирующим события • Инъектируется обработчик события• В MVC используется часто инъекция в контроллер, инъекция Модели в Представление

OO Testable Design и AOP

Page 20: Инъекция зависимости и Инверсия Контроля

Спасибо.


Recommended