将参数存储库传递给 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 更可取。
代码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 更可取。