如何在基于层的多模块 Android 应用程序中设置 HILT DI

问题描述 投票:0回答:1

我正在创建一个基于 Clean Archtecture 和应用程序模块化的 Android 应用程序。

我已将应用程序模块化为 4 层(:演示、:域:、:数据、公共)。 所需的层次结构如下

  1. :演示文稿可以访问:commons + :domain
  2. :域可以访问:commons
  3. :数据可以访问:commons + :domain
  4. :commons 不能访问其他模块

有问题吗?

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

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

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

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

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

可能的解决方案

  1. make :domain 模块包含 :data 模块,因此 :data 内容可以在 :domain 中访问。 (不能这样做,因为 :data 已经依赖于 :domain,它会生成循环依赖)

  2. 在 :presentation 中添加 HILT MODULE 和整个依赖注入内容,并使 :presentation include :data 模块(以创建依赖项)。我认为这是一个糟糕的方法,因为这样我们将把 :data 暴露给 :presentation,并且 :presentation 显然不需要访问 :data 内部发生的事情。

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

需要什么?

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

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

任何帮助将不胜感激。

android dagger-hilt clean-architecture use-case android-module
1个回答
0
投票

不一定要在 :data 中创建 DI 目录,含义类似于 :data,:domain,:presentation。 DI 的层次结构中也可以有一个目录。 第二。

api: RestaurantApi, localCacheRepository: LocalCacheRepository, database: MealBookingDatabase 
所有这些参数都应该是类似于单例注入的。
@Module @InstallIn(SingletonComponent::class) object DataDependenciesModule. 
你的 RestaurantRepositoryImpl 类将有一个可注入的构造函数。 毕竟,当您在 GetRestaurants 用例中注入接口时,它将可用。 只是一个提示,任何要放置在 Usecase 中的可注入都可以有 ViewModelComponent。希望有帮助

© www.soinside.com 2019 - 2024. All rights reserved.