У меня есть приложение на основе архитектуры 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
})
}
Это работает, но мне интересно, все они требуются или нет? Я могу применить базу данных комнаты к моему источнику данных. Есть ли способ лучше этого? Я знаю, что это может измениться в зависимости от приложения. Я пытаюсь найти лучший способ. Я буду рад, если вы что-нибудь предложите или расскажете о реализации шаблона репозитория.