用HILT提供域层UseCase类



我正在将谷歌I/O应用程序的一些架构设计实现到我自己的应用程序中,但我在他们的应用程序中遇到了一些让我感到困惑的东西。

他们与库可变性,领域层,我在我的应用程序通常使用自己。然而,我必须在我的应用程序中提供这些用例。但是在谷歌的I/O应用程序上,我找不到任何提供这些用例的模块。当使用viewmodels注释@HiltViewModel(在我自己的应用程序),它似乎是有效的?不知何故,这些被注入到我的视图模型。我必须用Hilt提供所有用例的依赖项(存储库等),但我不必通过Hilt提供任何用例。

下面是我的代码中的示例。

Usecase:

abstract class UseCase<in P, R>(private val coroutineDispatcher: CoroutineDispatcher) {
suspend operator fun invoke(parameters: P): Resource<R> {
return try {
withContext(coroutineDispatcher) {
execute(parameters).let {
Resource.Success(it)
}
}
} catch (e: Exception) {
Timber.d(e)
Resource.Error(e.toString())
}
}
@Throws(RuntimeException::class)
protected abstract suspend fun execute(parameters: P): R
}

用例的具体实现:

class GetListUseCase @Inject constructor(
private val coroutineDispatcher: CoroutineDispatcher,
private val remoteRepository: RemoteRepository
): UseCase<ListRequest,ItemsList>(coroutineDispatcher) {
override suspend fun execute(parameters: ListRequest): ItemsList{
return remoteRepository.getList(parameters)
}
}

Viewmodel:

@HiltViewModel
class DetailViewModel @Inject constructor(
private val GetListUseCase: getListUseCase
): ViewModel() {
suspend fun getList(): Resource<ItemsList> {
getPokemonListUseCase.invoke(ListRequest(3))
}
}

repo示例:

@Singleton
@Provides
fun provideRemoteRepository(
api: Api
): RemoteRepository = RemoteRepositoryImpl(api)

远程回购:

@ActivityScoped
class RemoteRepositoryImpl @Inject constructor(
private val api: Api
): RemoteRepository {
override suspend fun getList(request: ListRequest): PokemonList {
return api.getPokemonList(request.limit, request.offset)
}
}

My Question is:这是怎么做到的?为什么我不需要通过Hilt提供usecase ?或者是我的设计错了,我应该通过Hilt提供用例,即使这是有效的?

编辑:

如果有帮助,可以链接到Google I/O域层和ui层。

你的设计太棒了!这并没有错,但是,如果您将用例放在单独的模块中并根据您的需要对其进行限定,那么您可以为用例添加一些额外的上下文。模块主要存在于当你有第三方依赖的情况下(最简单的例子是OkHTTPClient)或当你有接口->或者你想要明显地限制/扩展组件的生命周期/可见性。

目前你告诉Hilt如何提供实例GetListUseCase通过注释它的构造函数与@Inject和Hilt已经知道什么是"CoroutineDispatcher"(因为它是由协程模块中的@ providers提供的,对吧?)以及RemoteRepository是什么(因为您正在注入接口,但在底层,您是通过@ providers在repo模块中提供它的实际实现)

这就像是在说——给我一个用例类的实例,它有两个构造函数依赖,Hilt都知道它们,所以它不会混淆。

如果你想有一个作用域绑定/组件(如解释这里)或标记你的用例单,然后你必须创建一个用例组件UseCaseModule和范围。

最新更新