Мне было интересно - как лучше издеваться над приемниками Kotlin? Говоря более конкретно, допустим, я определил следующие интерфейсы:
interface TransactionalRepository {
fun <T> withTransaction(TransactionalOperations.() -> T)
}
interface TransactionalOperations {
fun <T: Entity> save(entity: T)
fun <T: Entity> load(id: UUID): T
}
Предполагая, что у меня есть бизнес-логика c, использующая реализацию TransactionalRepository
, подобную этой:
fun decrementCounter(counterId: UUID) {
repository.transaction {
val entity: Counter = load(counterId)
entity.decrement()
save(entity)
}
}
Как лучше всего высмеивать взаимодействия между TransactionalRepository
и TransactionalOperations
?