我有一个基于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
})
}
它可以工作,但是我想所有这些都是必需的吗?我可以将会议室数据库应用于我的数据源。有什么办法比这更好的吗?我知道应用程序的情况可能会改变它。我试图找到最好的方法。如果您有任何建议或分享有关存储库模式实现的任何信息,我将感到高兴。