di.md
May 26, 2020 · View on GitHub
Инъекция зависимостей
В студийных приложениях используем паттерн Инъекция зависимостей.
Инъекция зависимостей реализована с помощью библиотеки Dagger 2. Область видимости более высокого уровня расширяет область видимости более низкого уровня. С помощью данного паттерна конфигурируются внешние модули, поставляются зависимости на внешние слои.
Выделяем 3 основных вида Scope (области видимости):
-
Scope приложения - предоставляет объекты, слоя Interactor. Эти объекты являются синглтонами.
-
Scope активити - предоставляет обьекты, привязанные к жизненному циклу Активити (например RxBus). Этот Скоуп располагается между скоупом приложения и экрана. Не забывайте пробрасывать обьекты из PerApplication в PerScreen через AppComponent и ActivityComponent.
-
Scope экрана - предоставляет объекты, привязанные к жизненному циклу экрана. Этот скоуп может применяться для экранов, основанных на Activity, Fragment, а также на Widget.
Замечание: несмотря на название Activity помечается скоупом экрана.
Основные скоупы в наших приложениях представлены аннотациями из модуля dagger-scope. При дальнейшем описании будут исользоваться они же.
Разрешается добавлять скоупы для собственных нужд, между уровнем приложения и уровнем экрана.
Для конфигурирования Dagger'а на экране создаются специальные конфигураторы, содержащие dagger-компонент и dagger-модули. Название конфигуратора должно соответствовать следующему правилу: <название экрана>ScreenConfigurator.
Все объекты для удовлетворения зависимостей разделены на логически связанные dagger модули.
Иерархия компонентов в наших приложениях
Следующая таблица показывает, как соотносятся Scope, Component и конфигураторы.
| Scope | Component | Configurator |
|---|---|---|
| @PerApplication | AppComponent | AppConfigurator |
| @PerActivity | ActivityComponent | BaseActivityConfigurator |
| @PerScreen | ScreenComponent и наследники | Base...ViewConfigurator |
Стандарт для наших приложений:
-
AppComponent - главный Dagger-компонент, является синглтоном, хранится в AppConfigurator;
-
ActivityComponent - компонент скоупа
@PerActivity. Хранится в BaseActivityConfigurator. -
ScreenComponent - компонент экрана.
-
Зависимости между компонентами реализуются через
Component dependency. Это позволяет контролировать, что будет проброшено в дочерний компонент.
За время жизни каждого скоупа отвечает делегат - BaseScreenDelegate.
После того , как умирает экран, он убивает PersistentScope, который в свою
очередь и содержит в себе конфигратор с компонентом. Таким образом не остается
внешних ссылок на компонент и он тоже стирается сборщиком мусора.
BaseActivityConfigurator и Base...ViewConfigurator расширяют базовые конфигураторы
из модулей core-mvp, core-ui
Добавление кастомного скоупа
Как добавить свой скоуп описано здесь.