Всем привет. Есть вопрос-уточнение по паттерну CQRS. В нём сказано, что команда не должна ничего отдавать. Команда должна только выполнять. Однако бывают ситуации, когда нам, например, при создании сущности и сохранения его в базе, необходимо сделать редирект на созданную запись.
Для создания мы посылаем команду CreateConmand, которая вызывает обработчикHandler с методом handle. Однако, в таком случае, созданная запись командой по всем правилам паттерна не должна ничего возвращать. Тогда возникает вопрос как нам получать данные созданной записи, для перенаправления на неё после создания?
CQRS паттерн не подходит для синхронных операций. Он существует только в асинхронном мире и единственное что ты можешь получить - ID задания (команды). В зависимости от того какой тип общения между системами есть 2 варианта:
- запрашивать до упора результат выполнения и данные по нему
- иметь обратный сигнальный канал
Паттерн мне нравится, но я его немного использую ужато. Без командной шины и частично использую Диспечер событий. Для основных операций команда работает напрямую с хендлером. Немного не правильно, но переключиться на шину будет не сложно. Поэтому изначально не отбрасываю этот паттерн.
А вот сейчас возникла такая необходимость в возвращении созданных данных. Получается, что и тут без небольшого нарушения не обойтись. Или как-то можно поступить иначе?) Неужели в этих асинхронных запросах никогда не требовалась такая реализация?
Ещё хотел спросить про ViewModel. Не подскажете как может выглядеть эта модель для Index страницы. Там же получается будет массив, но как его выводить этой моделью не понимаю...
Максим, про ViewModel отвечать не буду просто по тому что к топику не имеет отношения)
Если есть хоть небольшое нарушение то это уже не CQRS. В данной задаче необходимо событийную архитектуру. На основе MessageBus или событий она будет - уже не важно, но Command не может возвращать данные. У него просто не может быть доступа к тем данным что потребуются
Иван Шумов, получается такую задачу в этом паттерне нельзя реализовать? Я просто ещё не до конца в нем разобрался) Не видел нигде моей задачи и не мог найти информацию.
Максим, нельзя. В твоей задаче синхронная операция, которой не существует в данном паттерне. CQRS для задач где клиенту не важно когда будет обработано задание.
Иван Шумов, кстати. Сейчас в голову пришла одна мысль по этому решению. Можно ведь использовать UUID, который генерируется заранее и уже передается в команду, а потом делается редирект на этот UUID
Максим, Не страдай фигней и не применяй паттерны не по назначению просто от того что услышал классные новые буквы. В правильном CQRS следующим слоем идет domain (Читаем вдумчиво и внимательно, желательно в слух Domain Driven Design) и он не пропустит никаких навязанных ему идентификаторов.