将 Coroutine 调用放在 Repository 或 ViewModel 中哪个更好?

Cra*_*1hd 12 android mvvm coroutine kotlin android-room

只是想知道其他人的意见我有两种方法可以做某事并且很好奇哪个更好(希望你为什么这么认为)

我有 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)
    }

}
Run Code Online (Sandbox Code Playgroud)

版本 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)
            }
        }

}
Run Code Online (Sandbox Code Playgroud)

San*_*Lee 6

老实说,我认为任何一种方式都很好,但如果我必须选择,我更喜欢将与线程相关的代码保留在存储库层中。(示例中的版本 A

我的理由:

(A) 视图模型不应该假设存储库内部是如何工作的。版本 B意味着视图模型假定存储库将在调用线程上运行。

(B) 此外,存储库不应依赖其他组件使用特定线程来调用其方法。存储库本身应该是完整的。

(C) 避免代码重复。让多个视图模型调用一个存储库方法是一种非常常见的情况。在这种情况下,版本 A获胜,因为您只需要Corountine一个地方,即存储库。


我建议查看一些 Google 示例,看看他们喜欢在哪里处理Coroutine和数据访问线程代码。

  1. Sunflower使用Coroutine其存储库中的代码。这可能对您特别有用,因为它包含即发即忘类型请求的示例。

  2. GitHubBrowserRepo不使用,Coroutine但存储库保留对Executor访问数据时使用的实例的引用。