我正在创建一个基于 Clean Archtecture 和应用程序模块化的 Android 应用程序。
我已将应用程序模块化为 4 层(:演示、:域:、:数据、公共)。 所需的层次结构如下
有问题吗?
由于依赖性质,我在 :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)
}
}
可能的解决方案
make :domain 模块包含 :data 模块,因此 :data 内容可以在 :domain 中访问。 (不能这样做,因为 :data 已经依赖于 :domain,它会生成循环依赖)
在 :presentation 中添加 HILT MODULE 和整个依赖注入内容,并使 :presentation include :data 模块(以创建依赖项)。我认为这是一个糟糕的方法,因为这样我们将把 :data 暴露给 :presentation,并且 :presentation 显然不需要访问 :data 内部发生的事情。
在commons中包含DI,并在所有模块中包含commons,但是我们如何才能做到这一点:commons还需要包含其他模块中的类来创建它们。
需要什么?
使 RestaurantRepository 在 :domain 内的 GetRestaurants 用例中可访问,也许可以在此处创建任何我不知道的拦截器。
处理此类依赖注入需求的最佳方法是什么?
任何帮助将不胜感激。
不一定要在 :data 中创建 DI 目录,含义类似于 :data,:domain,:presentation。 DI 的层次结构中也可以有一个目录。 第二。
api: RestaurantApi, localCacheRepository: LocalCacheRepository, database: MealBookingDatabase
所有这些参数都应该是类似于单例注入的。
@Module @InstallIn(SingletonComponent::class) object DataDependenciesModule.
你的 RestaurantRepositoryImpl 类将有一个可注入的构造函数。
毕竟,当您在 GetRestaurants 用例中注入接口时,它将可用。
只是一个提示,任何要放置在 Usecase 中的可注入都可以有 ViewModelComponent。希望有帮助