이것은 버그를 수정하는 것 이상의 아키텍처 문제입니다.클린 아키텍처 : 안드로이드에서 여러 개의 유스 케이스가있는 ViewModel
이 응용 프로그램에서 사용자가 버스 및/또는 버스 방송국을 즐겨 찾기로 표시 할 수 있다고 가정 해 봅니다. 내 질문은 두 UseCases 모두 ViewModel
해야합니까 또는 현재 논리를 캡슐화하는 UseCase 빌드해야합니까?
또한 질문의 경우, 내가 UI 계층에 결합 된 데이터를 노출해야하는 방법은 어떤 의견을 환영합니다 사전에
감사 (favouritesExposedLiveData
참조) 완전히 확실하지 않다, 여기 내 ViewModel
당신이 추측 할 수 있어요 각 유스 케이스는 데이터 소스에서 올바른 데이터를 전달합니다.
open class FavouritesViewModel @Inject internal constructor(
private val getFavouriteStationsUseCase: GetFavouriteStationsUseCase,
private val getFavouriteBusesUseCase: GetFavouriteBusesUseCase,
private val favouriteMapper: FavouriteMapper,
private val busMapper: BusMapper,
private val stationMapper: StationMapper) : ViewModel() {
private val favouriteBusesLiveData: MutableLiveData<Resource<List<BusView>>> = MutableLiveData()
private val favouriteStationsLiveData: MutableLiveData<Resource<List<StationView>>> = MutableLiveData()
private lateinit var favouritesMediatorLiveData: MediatorLiveData<List<FavouriteView>>
private lateinit var favouritesExposedLiveData: LiveData<Resource<List<FavouriteView>>>
init {
fetchFavourites()
}
override fun onCleared() {
getFavouriteStationsUseCase.dispose()
getFavouriteBusesUseCase.dispose()
super.onCleared()
}
fun getFavourites(): LiveData<Resource<List<FavouriteView>>> {
return favouritesExposedLiveData
}
private fun fetchFavourites() {
favouritesMediatorLiveData.addSource(favouriteStationsLiveData, { favouriteStationListResource ->
if (favouriteStationListResource?.status == ResourceState.SUCCESS) {
favouriteStationListResource.data?.map {
favouriteMapper.mapFromView(it)
}
}
})
favouritesMediatorLiveData.addSource(favouriteBusesLiveData, { favouriteBusesListResource ->
if (favouriteBusesListResource?.status == ResourceState.SUCCESS) {
favouriteBusesListResource.data?.map {
favouriteMapper.mapFromView(it)
}
}
})
getFavouriteStationsUseCase.execute(FavouriteStationsSubscriber())
getFavouriteBusesUseCase.execute(FavouriteBusesSubscriber())
}
inner class FavouriteStationsSubscriber : DisposableSubscriber<List<Station>>() {
override fun onComplete() {}
override fun onNext(t: List<Station>) {
favouriteStationsLiveData.postValue(Resource(ResourceState.SUCCESS, t.map { stationMapper.mapToView(it) }, null))
}
override fun onError(exception: Throwable) {
favouriteStationsLiveData.postValue(Resource(ResourceState.ERROR, null, exception.message))
}
}
inner class FavouriteBusesSubscriber : DisposableSubscriber<List<Bus>>() {
override fun onComplete() {}
override fun onNext(t: List<Bus>) {
favouriteBusesLiveData.postValue(Resource(ResourceState.SUCCESS, t.map { busMapper.mapToView(it) }, null))
}
override fun onError(exception: Throwable) {
favouriteBusesLiveData.postValue(Resource(ResourceState.ERROR, null, exception.message))
}
}
}
참고 : 현재 MediatorLiveData
(favouritesMediatorLiveData
)이 시간에 다시 favouritesExposedLiveData
로부터 데이터를 바인딩하지 않습니다, 나는이 갈 올바른 방법입니다 확실하지 않다).
의견을 보내 주셔서 감사합니다. 질문에 답변하지 않으 셨습니다. 예, 버스와 역 (즐겨 찾기로 표시)을 모두 표시하려고합니다. –