欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

安卓架构用例最佳实践--用例的接口抽象

最编程 2024-05-31 18:32:26
...

有一些文章会看到对 UseCase 做接口抽象和派生。

//定义 UseCase 接口
interface GetSomethingUseCase {
    suspend operator fun invoke(): List<String>
}

//UseCase 派生类
class GetSomethingUseCaseImpl(
    private val repository: ChannelsRepository,
) : GetSomethingUseCase {
    override suspend operator fun invoke(): List<String> = repository.getSomething()
}

如上,定义 UseCase 的接口和对应实现,然后在 DI 容器中,可以通过 @Bind 提供实例注入。其实这种属于过度设计,单一职责的 UseCase 应该只有一个方法或一类重载方法,而且方法最好是纯函数逻辑,不依赖 UseCase 对象的任何状态,因此从这个角度讲,UseCase 可以是一个单例,直接使用 object 定义。

有时候 UseCase 需要动态依赖不同的 Repository,此时可以使用 class 定义 UseCase,按需实例化使用,或者在 DI 容器中被动注入,此时依赖的 Repository 可以从 DI 容器中自动获取。在 class 之外再定义一个 interface 必要性不大。

当然,还有一种使用 Kotlin 的 function interface 来定义 UseCase 的技巧,这里的 interface 主要目的不是为了抽象,而是想利用其单方法接口的特性,约束 UseCase class 里定义太多方法。

比如 , 像下面这样定义一个 UseCase 的单方法接口:

fun interface GetSomethingUseCase : suspend () -> List<String>

此时需要像下面这样实例化,只能定义一个方法,强制确保单一职责

val getSomethingUseCase = GetSomethingUseCase {
    repository.getSomething()
}

推荐阅读