只是想知道其他人的意见我有两种方法可以做某事并且很好奇哪个更好(希望你为什么这么认为)
我有 2 个文件 WordRepository 和 WordViewModel。我可以在 Repo 或 ViewModel 中执行协程,这两种方式都可以,但希望有人能给我一个线索,说明为什么我会在一种或另一种方式中执行协程,反之亦然。
版本 A.(协程在 Repo 中)
WordRepo:
class WordRepository(private val wordDao: WordDao): WordRepo {
@WorkerThread
override suspend fun deleteAllLogsOlderThan(XDays: Int): Int = withContext(IO) {
return@withContext wordDao.deleteAll()
}
}
WordViewModel:
class WordViewModel(private val wordRepository: WordRepo) : ViewModel() {
fun deleteAllLogsOlderThanA(XDays:Int): Int = runBlocking {
wordRepository.deleteAllLogsOlderThan(XDays)
}
}
版本 B.(协程在 ViewModel 中)
Word Repo:
class WordRepository(private val wordDao: WordDao): WordRepo {
@WorkerThread
override suspend fun deleteAllLogsOlderThan(XDays: Int): Int = wordDao.deleteAll()
}
WordViewModel:
class WordViewModel(private val wordRepository: WordRepo) : ViewModel() {
fun deleteAllLogsOlderThanA(XDays:Int): Int = runBlocking {
withContext(IO) {
wordRepository.deleteAllLogsOlderThan(XDays)
}
}
}
最佳答案
老实说,我认为这两种方式都可以,但如果我必须选择,我更愿意将与线程相关的代码保留在存储库层中。 (示例中的版本 A)
我的理由:
(A) View 模型不应假定存储库的内部工作方式。 版本 B 表示 View 模型假定存储库将在调用线程上运行。
(B) 此外,存储库不应依赖于其他组件来使用特定线程来调用其方法。存储库本身应该是完整的。
(C) 避免代码重复。让多个 View 模型调用一个存储库方法是一种非常常见的情况。 版本 A 在这种情况下胜出,因为您只需要在一个地方(存储库)使用 Corountine
。
我建议查看一些 Google 示例,看看他们喜欢在哪里处理 Coroutine
和数据访问线程代码。
Sunflower在他们的存储库中使用
Coroutine
代码。这可能对您特别有用,因为它包含即发即弃类型请求的示例。GitHubBrowserRepo不使用
Coroutine
,但存储库保留对访问数据时使用的Executor
实例的引用。
关于android - Coroutine 调用放在 Repository 和 ViewModel 哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55145822/