android - Android 中的存储库模式。有没有比这更好的方法?
问题描述
我有一个基于 MVVM 架构的应用程序。我有两个模块,存储库和数据源。并使用协程。我在 Github 上遇到了一些项目,它们采用了不同的方式。
我的实现是这样的;
You can think naming as login, profile etc. instead of X letter
数据源接口
interface IXDatasource{
suspend fun fetchData(): LiveData<XResponse>
}
数据源实现
class XDatasourceImp @Inject constructor(private val apiService: ApiService) : IXDatasource{
suspend fun fetchData(): LiveData<XResponse> {
// getting data
return xResponse
}
}
存储库接口
interface XRepository {
suspend fun getXData(): LiveData<XResponse>
}
存储库实现
class XRepositoryImp @Inject constructor(private val iDatasource: IXDatasource): XRepository {
override suspend fun getXData(): LiveData<XResponse> {
return withContext(Dispatchers.IO) {
iDatasource.fetchData()
}
}
}
我在我的 ViewModel 中调用了这个
class XViewModel @Inject constructor(xRepository: XRepository) : BaseViewModel() {
val xModel by lazyDeferred {
xRepository.getXData()
}
}
我在我的活动/片段中使用
private fun init() = launch {
val xModel = viewModel.xModel.await()
xModel.observe(this@MyActivity, Observer {
if (it == null) {
return@Observer
}
// filling views or doing sth
})
}
它有效,但我想知道所有这些都是必需的吗?我可以将房间数据库应用到我的数据源。有没有比这更好的方法?我知道它可以根据应用程序的情况而改变。我试图找到最好的方法。如果您提出任何建议或分享有关存储库模式实现的任何内容,我会很高兴。
解决方案
推荐阅读
- php - 格式化为特定 HTML 的递归树
- javascript - 如何切换自身/目标元素
- javascript - Javascript 生成器函数似乎没有被调用
- javascript - 如果在内容仍在滚动时点击它,移动设备上的滚动到顶部按钮不起作用
- scala - 使用带有列名列表的 Spark DataFrame 过滤器
- python - Python CPLEX 记录可行解
- azure - 使用客户端、服务器部署解决方案并共享到 azure(Blazor wasm、.net core api)
- laravel - Laravel 5.7 验证无济于事
- python - 比较两个数据帧并在 Python 中查找每个数据帧中缺少的内容
- java - 如何使用 Selenium WebDriver 与 Angular ColorPicker 组件交互?