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 и конфигураторы.

ScopeComponentConfigurator
@PerApplicationAppComponentAppConfigurator
@PerActivityActivityComponentBaseActivityConfigurator
@PerScreenScreenComponent и наследникиBase...ViewConfigurator

Стандарт для наших приложений:

  • AppComponent - главный Dagger-компонент, является синглтоном, хранится в AppConfigurator;

  • ActivityComponent - компонент скоупа @PerActivity. Хранится в BaseActivityConfigurator.

  • ScreenComponent - компонент экрана.

  • Зависимости между компонентами реализуются через Component dependency. Это позволяет контролировать, что будет проброшено в дочерний компонент.

За время жизни каждого скоупа отвечает делегат - BaseScreenDelegate. После того , как умирает экран, он убивает PersistentScope, который в свою очередь и содержит в себе конфигратор с компонентом. Таким образом не остается внешних ссылок на компонент и он тоже стирается сборщиком мусора.

BaseActivityConfigurator и Base...ViewConfigurator расширяют базовые конфигураторы из модулей core-mvp, core-ui

Добавление кастомного скоупа

Как добавить свой скоуп описано здесь.