Работа с несколькими репозиториями в одной ViewModel на kotlin - PullRequest
0 голосов
/ 24 января 2020

Подскажите, пожалуйста, как сделать его более корректным, чтобы ViewModel поддерживал работу с нужным репозиторием, в зависимости от параметра viewmodel? Android приложение должно отображать список запросов, запросы бывают разных типов. Я хочу использовать один фрагмент для запросов разных типов, и в одной модели я хочу универсально работать с хранилищем, которое будет извлекать запросы нужного типа из базы данных (Room).

Я создал общий интерфейс для репозитории:

interface RequestRepository<T> {

    fun getRequests(): LiveData<List<T>>

    fun getRequestById(requestId: String): LiveData<T>

    suspend fun insertRequests(requests: List<T>)

    suspend fun deleteRequest(request: T)

    suspend fun deleteAllRequests()

}

Это один из репозиториев:

class PaymentRequestRepository private constructor(private val paymentRequestDao: PaymentRequestDao) : RequestRepository<PaymentRequest> {

    override fun getRequests() = paymentRequestDao.getRequests()

    override fun getRequestById(requestId: String) = paymentRequestDao.getRequestById(requestId)

    override suspend fun insertRequests(requests: List<PaymentRequest>) {
        paymentRequestDao.deleteAll()
        paymentRequestDao.insertAll(requests)
    }

    override suspend fun deleteRequest(request: PaymentRequest) = paymentRequestDao.delete(request)

    override suspend fun deleteAllRequests() = paymentRequestDao.deleteAll()

    companion object {

        // For Singleton instantiation
        @Volatile private var instance: PaymentRequestRepository? = null

        fun getInstance(paymentRequestDao: PaymentRequestDao) =
            instance ?: synchronized(this) {
                instance ?: PaymentRequestRepository(paymentRequestDao).also { instance = it }
            }
    }

}

Как в ViewModel работать с необходимым репозиторием в зависимости от типа запроса?

class RequestListViewModel(application: Application, val requestType: RequestType): AndroidViewModel(application) {

    //lateinit var paymentRequestRepository: PaymentRequestRepository
    //lateinit var serviceRequestRepository: ServiceRequestRepository
    lateinit var requestRepository: RequestRepository<BaseRequestDao<Request>>

    ...

    init {
        val database = AgreementsDatabase.getDatabase(application)

        when (requestType) {
            RequestType.MONEY -> {
                val paymentRequestDao = database.paymentRequestsDao()
                requestRepository = PaymentRequestRepository.getInstance(paymentRequestDao)
            }
            RequestType.SERVICE -> {
                val serviceRequestDao = database.serviceRequestsDao()
                requestRepository = ServiceRequestRepository.getInstance(serviceRequestDao)
            }
            RequestType.DELIVERY -> {
                val deliveryRequestsDao = database.deliveryRequestsDao()
                requestRepository = DeliveryRequestRepository.getInstance(deliveryRequestsDao)
            }
        }
        _requests = requestRepository.getRequests()

        updateRequests();
    }
}

** При создании хранилища я получаю ошибку несоответствия типов: **

requestRepository = PaymentRequestRepository.getInstance (paymentRequestDao)

Скажите, как это сделано правильно?

...