Я немного озадачен процессом в системе, использующей события домена для построения модели чтения. В частности, как мы имеем дело с тем фактом, что пользователь ожидает изменения данных (и их представления) при выполнении команды, но из-за архитектуры нашей системы (неблокирующие вызовы для публикации событий) фактическая база данных может не измениться до того, как страница перезагружена?
Я надеюсь перевести дизайн одной из наших систем в соответствие с CQRS, используя события и служебную шину.
Допустим, мой поток выглядит так:
Пользователь нажимает кнопку в представлении, чтобы выполнить задачу удаления способа оплаты со своей учетной записи.
Контроллер вызывает PaymentMethodRemovalService, передавая ему accountId & paymentMethodId.
Контроллер использует AccountRepository для извлечения учетной записи и вызывает account.RemovePaymentMethod (id)
Аккаунт подтверждает, что операция может произойти, и публикует событие PaymentMethodRemovedMessage (accountId, paymentMethodId)
Поскольку публикация событий является асинхронной, теперь мы должны вернуться из сервиса и вернуть представление из контроллера - , но наши фактические данные еще не обновлены !
Обработчик IHandle , слышит событие и удаляет фактическую строку из БД
Итак, что делать парню?
Я мог бы просто, скажем, удалить div, который отображал способ оплаты. Это может работать в сценарии AJAX, но что, если я использую Post-Redirect-Get для поддержки клиентов не-JavaScript. Затем я буду запускать Get и читать данные со стороны Query, возможно, до того, как они обновятся.
Я просто показываю уведомление о том, что их запрос на удаление способа оплаты был отправлен? (что не кажется дружественным, имеет смысл для отправки заказа, но не для, скажем, изменения адреса).
Есть ли способ согласовать внедряемые изменения в виде несвязанных асинхронных событий и отображения пользовательских данных, отражающих их текущее изменение?
РЕДАКТИРОВАТЬ: мой вопрос очень похож на CQRS, база данных отчетов о синхронизации DDD Я должен сказать, что ответ, данный там, а также здесь упоминается, имеет какой-то запах - спорят пользовательский интерфейс чтобы показать обновление, которое вне диапазона с прочитанной БД, так сказать. Я надеялся на что-нибудь немного чище.