Есть одна вещь о CQRS, которую я не получаю: как обновить модель чтения, когда поднятое событие не содержит сведений, необходимых для обновления модели чтения.
К сожалению, это довольно распространенный сценарий.
Пример. Я добавляю пользователя в группу, поэтому я отправляю команду addUserToGroup (userId, groupId). Это получено, обрабатывается обработчиком команд, создается событие "userAddedToGroup", сохраняется и публикуется.
Теперь обработчик события получает это событие и оба идентификатора. Теперь должно быть представление, в котором перечислены все пользователи с именами групп, в которых они находятся. Чтобы обновить модель чтения для этого представления, нам нужен идентификатор пользователя (который у нас есть) и имя группы (которое мы надеваем, t есть, у нас есть только его id).
Итак, вопрос: как мне обрабатывать этот сценарий?
В настоящее время мне приходят четыре варианта, все с их конкретными недостатками:
-
Прочитанная модель запрашивает домен. = > Запрещено и даже не возможно, поскольку у домена только поведение, нет (общедоступное) состояние.
-
Модель чтения считывает имя группы из другой таблицы в модели чтения. = > Работает, но что, если нет соответствующей таблицы?
-
Добавьте необходимые данные в событие. = > Не работает, так как это означает, что мне также нужно было обновить все предыдущие события, и я не могу предвидеть, какие данные мне могут понадобиться в один прекрасный день.
-
Не обрабатывайте событие с помощью "обычного" обработчика событий, а запускайте процесс ETL в фоновом режиме, который связан с хранилищем событий, создает необходимые данные и записывает модель чтения. = > Работает, но для меня это кажется немного слишком сложным для такого простого сценария.
Итак, возникает вопрос: как я правильно справляюсь с этим сценарием?