События CQRS не содержат деталей, необходимых для обновления модели чтения.
В CQRS есть одна вещь, которую я не понимаю: как обновить модель чтения, если возбужденное событие не содержит сведений, необходимых для обновления модели чтения.
К сожалению, это довольно распространенный сценарий.
Пример: я добавляю пользователя в группу, поэтому отправляю команду addUserToGroup (userId, groupId). Это получено, обработано обработчиком команды, событие userAddedToGroup создано, сохранено и опубликовано.
Теперь обработчик события получает это событие и оба идентификатора. Теперь должно появиться представление, в котором перечислены все пользователи с именами групп, в которых они находятся. Чтобы обновить модель чтения для этого представления, нам нужен идентификатор пользователя (который у нас есть) и имя группы (которое мы не называем); у нас есть только его идентификатор).
Итак, вопрос: как мне справиться с этим сценарием?
В настоящее время мне на ум приходят четыре варианта, каждый со своими специфическими недостатками:
The read model asks the domain. => Forbidden, and not even possible, as the domain only has behavior, no (public) state.
The read model reads the group name from another table in the read model. => Works, but what if there is no matching table?
Add the neccessary data to the event. => Does not work, as this means that I had to update all previous events as well, and I cannot foresee which data I may need one day.
Do not handle the event via a "usual" event handler, but start an ETL process in the background that deals with the event store, creates the neccessary data and writes the read model. => Works, but to me this seems a little bit of way too much overhead for such a simple scenario.
Итак, вопрос: как мне правильно справиться с этим сценарием?