提问人:NS. 提问时间:9/20/2023 最后编辑:NS. 更新时间:9/24/2023 访问量:127
如何在层基多模块安卓应用程序中设置 HILT DI
How to setup HILT DI in layer base multi-module android application
问:
我正在创建一个基于 Clean Archtecture with App Modularization 的 Android 应用程序。
我已经将应用程序模块化了 4 层(:p resentation、:d omain:、:d ata、commons)。 所需的层次结构如下
- :p resentation 可以访问 :commons + :d omain
- :d omain 可以访问 :commons
- :d ata可以访问 :commons + :d omain
- :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)
}
}
可能的解决方案
使 :d Omain 模块包含 :d ata 模块,因此可以在 :d Omain 中访问 :d ata 内容。(不能这样做,因为:d ata已经依赖于:d omain,它会产生一个循环依赖)
在 :p resentation 中添加 HILT MODULE 和整个依赖注入内容,并使 :p resentation 包含 :d ata 模块(以创建依赖项)。我认为这是一种糟糕的方法,因为这样我们将:d ata暴露于:p怨恨中,而:p怨恨显然不需要访问:d ata内部发生的事情。
在 commons 中包含 DI,并在所有模块中包含 commons,但是我们怎样才能做到这一点:commons 还需要包含其他模块中的类才能创建它们。
需要什么?
在 :d omain 内的 GetRestaurants 用例中使 RestaurantRepository 可访问,也许可以在这里创建任何我不知道的拦截器。
处理此类依赖注入要求的最佳方法是什么?
任何帮助将不胜感激。
答:
在 :d ata 中创建 DI dir 不是必须的,这意味着像
- :数据
- :域
- :介绍
- :地
DI 的层次结构中也可以有一个 dir。 所有这些参数都应该与单例注射剂相似。 你的这个类将有一个可注入的构造函数。
然后,当您在GetRestaurants用例中注入界面时,它将可用。
只需提示,任何要放置在 Usecase 中的可注入物都可以具有 ViewModelComponent。希望对您有所帮助api: RestaurantApi, localCacheRepository: LocalCacheRepository, database: MealBookingDatabase
@Module @InstallIn(SingletonComponent::class) object DataDependenciesModule.
RestaurantRepositoryImpl
我通过在模块中包含 hilt 模块解决了这个问题,因为它包含您定义的所有模块。:app
评论