如何在层基多模块安卓应用程序中设置 HILT DI

How to setup HILT DI in layer base multi-module android application

提问人:NS. 提问时间:9/20/2023 最后编辑:NS. 更新时间:9/24/2023 访问量:127

问:

我正在创建一个基于 Clean Archtecture with App Modularization 的 Android 应用程序。

我已经将应用程序模块化了 4 层(:p resentation、:d omain:、:d ata、commons)。 所需的层次结构如下

  1. :p resentation 可以访问 :commons + :d omain
  2. :d omain 可以访问 :commons
  3. :d ata可以访问 :commons + :d omain
  4. :commons access no other module

问题?

由于依赖性,我在 :d ata 模块中添加了 HILT MODULE,因为它属于那里。它实现了 :d omain 模块中定义的 RestaurantRepository 接口。

@Module
@InstallIn(SingletonComponent::class)
object DataDependenciesModule {

    @Singleton
    @Provides
    fun providesRestaurantRepository(
        api: RestaurantApi,
        localCacheRepository: LocalCacheRepository,
        database: MealBookingDatabase
    ): RestaurantRepository {
        return RestaurantRepositoryImpl(api, localCacheRepository, database)
    }

下面是使用/需要此依赖项的用例,位于 :d omain 模块中(当然用例位于 :d omain modue 中),但该依赖项无法在那里访问。

class GetRestaurants @Inject constructor(
    private val repository: RestaurantRepository,
) {
    suspend operator fun invoke(
        fetchFromApi: Boolean,
    ): Flow<Resource<List<Restaurant>>> {
        return repository.getRestaurants(fetchFromApi)
    }
}

可能的解决方案

  1. 使 :d Omain 模块包含 :d ata 模块,因此可以在 :d Omain 中访问 :d ata 内容。(不能这样做,因为:d ata已经依赖于:d omain,它会产生一个循环依赖)

  2. 在 :p resentation 中添加 HILT MODULE 和整个依赖注入内容,并使 :p resentation 包含 :d ata 模块(以创建依赖项)。我认为这是一种糟糕的方法,因为这样我们将:d ata暴露于:p怨恨中,而:p怨恨显然不需要访问:d ata内部发生的事情。

  3. 在 commons 中包含 DI,并在所有模块中包含 commons,但是我们怎样才能做到这一点:commons 还需要包含其他模块中的类才能创建它们。

需要什么?

在 :d omain 内的 GetRestaurants 用例中使 RestaurantRepository 可访问,也许可以在这里创建任何我不知道的拦截器。

处理此类依赖注入要求的最佳方法是什么?

任何帮助将不胜感激。

android dagger-hilt clean-architecture 用例 android-module

评论


答:

0赞 Muslim 9d 9/20/2023 #1

在 :d ata 中创建 DI dir 不是必须的,这意味着像

  1. :数据
  2. :域
  3. :介绍
  4. :地

DI 的层次结构中也可以有一个 dir。 所有这些参数都应该与单例注射剂相似。 你的这个类将有一个可注入的构造函数。 然后,当您在GetRestaurants用例中注入界面时,它将可用。 只需提示,任何要放置在 Usecase 中的可注入物都可以具有 ViewModelComponent。希望对您有所帮助api: RestaurantApi, localCacheRepository: LocalCacheRepository, database: MealBookingDatabase @Module @InstallIn(SingletonComponent::class) object DataDependenciesModule. RestaurantRepositoryImpl

1赞 ObscureCookie 9/24/2023 #2

我通过在模块中包含 hilt 模块解决了这个问题,因为它包含您定义的所有模块。:app