Как добавить независимый Dagger Сomponent в иерархию SubComponnet-ов Hilt используя подход «component dependencies»?

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Версия на английском

Существуют 2 способа связи компонентов в Dagger: Subcomponents и Component Dependencies и каждый из них имеет свои преимущества.

Например, при использовании подхода Subcomponents весь код генерируется в :app модуле и это может привести к ошибке компиляции вроде “cannot access SomeClass” из-за транзитивной зависимости на этот класс. Component dependencies может быть использован для решения такой проблемы. Подробнее об этом можно прочитать в статье Lock your Dagger in Gradle Modules.

Hilt базируется на подходе subcomponents и описание этих компонентов скрыто от нас, поэтому мы не можем добавить зависимость на внешний компонент. Давайте посмотрим, как это можно обойти.

Предположим, у нас есть 2 gradle модуля :app -> :feature и есть независимый dagger component в :feature модуле (здесь только чистый Dagger, нет плагина и зависимостей для Hilt) который мы хотим добавить как component dependency в иерархию компонентов Hilt.

// :feature module
@Singleton
@Component
interface SomeFeatureComponent {
    fun someFeature(): SomeFeature
}

Для этого можно создать «proxy» Hilt модуль, который будет хранить в себе внешний компонент и предоставлять зависимости в граф Hilt. Теперь `someFeature` из внешнего dagger component’а может быть инжектирована через Hilt везде, где вам потребуется в :app модуле.

// :app module
@Module
@InstallIn(SingletonComponent::class)
internal class SomeFeatureProxyModule {

    // Pass as method args any dependencies from :app you need to build component
    @Singleton
    @Provides
    fun someFeatureComponent(application: Application): SomeFeatureComponent {
        return DaggerSomeFeatureComponent.builder().build()
    }

    // Use someFeature in Hilt
    @Provides
    fun someFeature(someFeatureComponent: SomeFeatureComponent): SomeFeature {
        return someFeatureComponent.someFeature()
    }
}

Стоит заметить, что это решение работает не только для Hilt, но для и подхода через subcomponents в целом. Когда вы не используете Hilt и вручную описываете граф, вы можете определить зависимости только для корневого компонента, аннотированного @Component, но для любого дочернего компонента, аннотированного @Subcomponent такой возможности уже нет. Тем не менее, можно добавить @Module к @Subcoponent и использовать описанный обходной путь.

Исходный код доступен на GitHub

Источник: https://habr.com/ru/post/571434/


Интересные статьи

Интересные статьи

Настало время разобраться с интересной библиотекой Hilt, которая построена на базе Dagger, и которую рекомендует использовать https://developer.android.com при создании р...
На нескольких примерах я покажу, как можно легко и эффективно создавать проекты от этапа проектирования до релиза продукта. Читать далее
Часто от программистов PHP можно услышать: «О нет! Только не „Битрикс“!». Многие специалисты не хотят связываться фреймворком, считают его некрасивым и неудобным. Однако вакансий ...
Структурирование неструктурированных данных с помощью GROK Если вы используете стек Elastic (ELK) и заинтересованы в сопоставлении пользовательских журналов Logstash с Elasticsearch,...
История сегодня пойдёт про автосервис в Москве и его продвижении в течении 8 месяцев. Первое знакомство было ещё пару лет назад при странных обстоятельствах. Пришёл автосервис за заявками,...