Нашел невероятно красивое решение, как слой usecase, являющихся прокси к репозиторию, облегчить.
Допустим у нас есть репозиторий:
class CounterRepository {
private val _value = StateFlow(0)
val value: Flow<Int> = _value
fun addOne() { _value.update { it + 1 } }
fun subOne() { _value.update { it - 1 } }
}
Тогда примитивные прокси usecase(представим их сразу как интерфейсы) будут выглядеть так:
interface AddUseCase { fun addOne() }
interface SubUseCase { fun subOne() }
interface GetValueUseCase {
val value: Flow<Int>
}
Значит, в целом, мы можем представить репозиторий, как реализацию этих интерфейсов:
class CounterRepository:
AddUseCase,
SubUseCase,
GetValueUseCase {
override val value: Flow<Int> ...
override fun addOne() ...
override fun subOne() ...
}
А раз есть реализация, значит можно инжектить ее напрямую в VM
class CountingViewModel(
private val addOne: AddOneUseCase,
private val subOne: SubUseCase,
private val getValue: GetValueUseCase,
): ViewModel() {
...
}
Пример целиком, но с большим количеством обслуживающего кода: Гист
Вроде бы использованы базовые паттерны, но такой реализации еще не видел