将参数存储库传递给 ViewModel 而不是从 AndroidViewModel 继承是个好主意吗?

Is it a good idea to pass paramter repository to ViewModel instead of inherited from AndroidViewModel?

代码A来自https://github.com/android/architecture-components-samples/tree/master/PagingWithNetworkSample

代码 B 来自 https://github.com/android/architecture-components-samples/tree/master/PagingSample

我知道当我需要使用 Context 来实例化基于数据库的 Room 时,我应该使用 AndroidViewModel 而不是 ViewModel,就像代码 B.

我发现代码A中的class SubRedditViewModel不是继承自AndroidViewModel,它使用构造函数传递参数repository

将参数 repository 传递给 ViewModel 而不是继承自 AndroidViewModel 是个好主意吗?

代码A

class SubRedditViewModel(
        private val repository: RedditPostRepository,
        private val savedStateHandle: SavedStateHandle
) : ViewModel() {
   ...
}

代码B

class CheeseViewModel(app: Application) : AndroidViewModel(app) {
    val dao = CheeseDb.get(app).cheeseDao()
    ...
}

在您继承 AndroidViewModel 的那一刻,您的 class 变得不太可单元测试,因为您依赖于 Android 框架。此外,在您的代码段代码 B 中,您失去了为 dao 注入测试替身的能力,这使得测试更加困难。

总而言之,尽量避免使用框架 classes 并练习依赖注入(手动或借助像 Dagger 这样的 DI 框架,没关系)。因此,您的代码段代码 A 更可取。