Я пытаюсь реализовать QueryBus.По сути, я хочу зарегистрировать список QueryHandler
s.Каждый QueryHandler
реализует метод handle
, определенный интерфейсом.Каждый QueryHandler
связан с Query
.Я хочу иметь возможность получить QueryHandler
, используя Query
и вызвать handle
.
Дело в том, что дескриптор должен быть универсальным, потому что каждый QueryHandler
обрабатывает Query
по-своему,Все они берут выделенный Query
и могут вернуть все, что захотят.
interface Query<R>
interface QueryHandler<R, Q : Query<R>> {
fun handle(query: Q): R
fun listenTo(): String
}
// DTOs
data class BookDto(val name: String)
// List books query
data class ListBooksQuery(val page: Int = 1): Query<List<BookDto>>
class ListBooksQueryHandler: QueryHandler<List<BookDto>, ListBooksQuery> {
override fun handle(query: ListBooksQuery): List<BookDto> {
return listOf(BookDto("Dune"), BookDto("Dune II"))
}
override fun listenTo(): String = ListBooksQuery::class.toString()
}
// Get book query
data class GetBookQuery(val name: String): Query<BookDto?>
class GetBookQueryHandler: QueryHandler<BookDto?, GetBookQuery> {
override fun handle(query: GetBookQuery): BookDto {
return BookDto("Dune")
}
override fun listenTo(): String = GetBookQuery::class.toString()
}
// Run it!
fun main(args: Array<String>) {
// Initializing query bus
val queryHandlers = mapOf(
with(ListBooksQueryHandler()) {this.listenTo() to this},
with(GetBookQueryHandler()) {this.listenTo() to this}
)
val command = ListBooksQuery()
val result = queryHandlers[command::class.toString()].handle(command)
// Should print the list of BookDto
print(result)
}
Я даже не знаю, возможно ли это, если честно.
ОБНОВЛЕНИЕ 1: Я изменил пример использования в основном, чтобы показать, что я действительно пытаюсь сделать.List
был для (плохой?) Демонстрационной цели.Я хочу сохранить QueryHandler
s и получить их с карты.
Дополнительные ресурсы:
Вот что я действительно хочу сделать: https://gist.github.com/ValentinTrinque/76b7a32221884a46e657090b9ee60193