Как можно эффективно использовать Hilt в многомодульных приложениях в соответствии с принципами ЧИСТОЙ архитектуры?

Я создаю приложение для Android, следуя принципам чистой архитектуры. Вот что у меня есть:

модуль приложения:

  • Содержит все зависимости Android.
  • Использует MVVM с ViewModel из компонентов арки.
  • ViewModels взаимодействует только с прецедентами, которые вводятся конструктором.

модуль сценария использования:

  • Содержит все варианты использования.
  • Сценарии использования взаимодействуют только с репозиториями, которые вводятся конструктором.

модуль репозитория:

  • Содержит все репозитории.
  • Репозитории взаимодействуют с веб-службами или базами данных и т. Д.
  • У меня есть интерфейс Retrofit, определенный на этом уровне, который репозиторий принимает в своем конструкторе.

модуль данных:

  • Содержит все модели данных

Я пытаюсь использовать Hilt для внедрения зависимостей в приложение. Я не хочу раскрывать Retrofit, OkHttp и т. Д. В модуле приложения, потому что я не хочу, чтобы разработчики могли помещать сетевой код в неправильный модуль. Помните, что модуль приложения использует ViewModel, который может говорить ТОЛЬКО о вариантах использования.

Как мне это настроить? Я попытался поместить модули кинжала в каждый из этих модулей, чтобы определить инъекцию, затем в основной модуль приложения я включил модуль из варианта использования:

@Module(includes = [UseCaseModule::class])
@InstallIn(ApplicationComponent::class)
object AppModule

но это не работает, поскольку он начинает жаловаться на то, что не может найти транзитивные зависимости в других модулях, которые я хочу скрыть.


person Christopher Perry    schedule 03.11.2020    source источник
comment
ты найдешь какое-нибудь решение.   -  person Anil    schedule 16.04.2021
comment
У меня такая же проблема   -  person PhongBM    schedule 11.05.2021


Ответы (2)


К сожалению, в настоящее время Hilt использует монолитный подход. Это означает, что ваш app модуль будет иметь доступ ко ВСЕМ вашим модулям.

Я не хочу раскрывать Retrofit, OkHttp и т. Д. В модуле приложения, потому что я не хочу, чтобы разработчики могли помещать сетевой код в неправильный модуль.

Нет, вам не нужно включать классы, связанные с сетью, в модуль app. Скорее в модуле data.

Но имейте в виду, что модуль app по-прежнему будет иметь косвенный доступ к Retrofit, реализовав модуль data для работы Hilt. Вы можете проверить это сообщение.

person princessdharmy    schedule 21.11.2020
comment
Итак, если app модуль не зависит от «данных», Hilt не будет работать? - person PhongBM; 11.05.2021
comment
@PhongBM Нет, не пойдет. - person princessdharmy; 13.05.2021

У меня такой же подход с несколькими модулями, но он немного шире, чем у вас, и он работает (приложение, ядро, навигация, api, данные, домен, презентация, coreAndroidTest).

Для AppModule не нужно указывать, что включает UseCaseModule, просто убедитесь, что вы добавили @InstallIn ApplicationComponent:

@Module
@InstallIn(ApplicationComponent::class)
class AppModule {

    @Provides
    fun provideContext(app: Application): Context = app.applicationContext

    @Provides
    fun provideResources(app: Application): Resources = app.resources
}

Точно так же, когда вы определяете свой UseCaseModule в другом модуле:

@Module
@InstallIn(ApplicationComponent::class)
class DomainModule {
// Your @Provides
}
person Fernando Prieto Moyano    schedule 16.11.2020