干净的体系结构:Android上具有多个用例的ViewModel

干净的体系结构:Android上具有多个用例的ViewModel,android,mvvm,architecture,kotlin,viewmodel,Android,Mvvm,Architecture,Kotlin,Viewmodel,这与其说是一个bug修复问题,不如说是一个架构问题 假设此应用程序允许用户将公交车和/或公交车站标记为收藏夹。我的问题是,我应该拥有一个同时包含两个用例的ViewModel,还是应该构建一个封装当前逻辑的用例 同样对于问题部分,我不完全确定应该如何向UI层公开组合数据(请参见FavoriteSposedLiveData) 提前感谢您欢迎任何反馈,这里是我的ViewModel,您可以假设每个用例都从数据源传递了正确的数据 openclass-favoritesviewmodel@Inject内部构

这与其说是一个bug修复问题,不如说是一个架构问题

假设此应用程序允许用户将公交车和/或公交车站标记为收藏夹。我的问题是,我应该拥有一个同时包含两个用例的
ViewModel
,还是应该构建一个封装当前逻辑的用例

同样对于问题部分,我不完全确定应该如何向UI层公开组合数据(请参见
FavoriteSposedLiveData

提前感谢您欢迎任何反馈,这里是我的
ViewModel
,您可以假设每个用例都从数据源传递了正确的数据

openclass-favoritesviewmodel@Inject内部构造函数(
private val GetFavoriteStationUseCase:GetFavoriteStationUseCase,
private val GetFavoriteBuseSuseCase:GetFavoriteBuseSuseCase,
private val FavoriteMapper:FavoriteMapper,
专用val总线映射器:总线映射器,
私有val stationMapper:stationMapper):ViewModel(){
private val-favoritebuseslivedata:MutableLiveData=MutableLiveData()
私有val FavoriteStationLiveData:MutableLiveData=MutableLiveData()
私有lateinit变量FavoriteSmediatorLiveData:MediatorLiveData
私有lateinit变量FavoriteSposedLiveData:LiveData
初始化{
最喜欢的
}
覆盖有趣的onCleared(){
GetFavoriteStationUseCase.dispose()
GetFavoriteBuseSuseCase.dispose()
super.onCleared()
}
趣味GetFavorites():LiveData{
返回FavoriteSposedLiveData
}
私人娱乐最爱(){
FavoriteSmediatorLiveData.addSource(FavoriteStationLiveData,{FavoriteStationListResource->
if(FavoriteStationListResource?.status==ResourceState.SUCCESS){
FavoriteStationListResource.data?.map{
FavoriteMapper.mapFromView(it)
}
}
})
addSource(FavoriteBusesLiveData,{FavoriteBusesListResource->
if(FavoriteBusesListResource?.status==ResourceState.SUCCESS){
FavoriteBuseSListResource.data?.map{
FavoriteMapper.mapFromView(it)
}
}
})
GetFavoriteStationUseCase.execute(FavoriteStationSubscriber())
GetFavoriteBuseSuseCase.execute(FavoriteBuseSubscriber())
}
内部类FavoriteStationSubscriber:DisposableSubscriber(){
重写fun onComplete(){}
覆盖下一页(t:列表){
FavoriteStationsLiveData.postValue(资源(ResourceState.SUCCESS,t.map{stationMappper.mapToView(it)},null))
}
覆盖错误(例外:可丢弃){
FavoriteStationsLiveData.postValue(资源(ResourceState.ERROR,null,exception.message))
}
}
内部类FavoriteBusesSubscriber:DisposableSubscriber(){
重写fun onComplete(){}
覆盖下一页(t:列表){
postValue(资源(ResourceState.SUCCESS,t.map{busMapper.mapToView(it)},null))
}
覆盖错误(例外:可丢弃){
FavoriteBuseSliveData.postValue(资源(ResourceState.ERROR,null,exception.message))
}
}
}

注意:目前,
MediatorLiveData
favoritesmediatorlivedata
)没有将数据绑定回
favoritesposedlivedata
,因为此时,我不确定这是正确的方式;)

ViewModel的全部要点在于它是视图所使用内容的模型。它应该尽可能地接近那个。。除非在同一视图列表中显示车站和公交车(看起来很难看),否则,它们是单独的视图,应该具有单独的模型。

理想情况下,视图模型仅具有其视图的视图状态。通过使用MediatorLiveData,您可以将所有状态源聚合为一个表示视图状态的源

您可以拥有一个数据类,它表示您在视图模型上构建的视图状态,并且是您公开的LiveData

data class-favoritesviewstate(val-favoriteStations:List,val-favoritbus:List)

但是,您知道,依赖ViewModel来构建最终的ViewState,这有点违反了单一责任原则,也使您依赖于Android框架


我将使用一个包含站点和站点用例的复合用例来处理它,并返回合成数据,然后您可以从ViewModel轻松公开这些数据。

感谢您的反馈,但您并没有真正回答这个问题,是的,我想同时显示总线和站点(标记为收藏夹)。