В ES + CQRS + DDD может ли событие вообще не обновлять какое-либо реальное состояние домена?


Будет ли нормально иметь события в потоке событий, которые не влияют на агрегат в состоянии домена?

Возьмем, например, такое событие, как AllCompletedTodosPurged, которое не делает ничего, кроме изменениямодели чтения с активными todos путем удаления всех завершенных todos.

2 5

2 ответа:

Нет,все будет не так. Событие домена генерируется при изменении агрегатного состояния. Если ничего не изменилось, доменное событие отсутствует.

Вы также можете использовать события вне домена, но они не будут частью домена и, очевидно, не будут частью потока событий.

В вашем сценарии, если событие не генерируется как эффект агрегированного изменения, почему оно должно содержаться в любом агрегате? И технически говоря, в какой поток событий вы добавите это событие если он вообще никому не принадлежит? Вы добавите это событие для всех вовлеченных ToDos? В этом нет никакого смысла.

Я не уверен, что purge является частью вашего домена, но если это так, это означает, что все завершенные todos уже "удалены", то есть каждый вовлеченный агрегат уже имеет событие ToDoDeleted в своей коллекции. AllCompletedTodosPurged - это просто событие, которое полезно для обновления модели чтения, но это все. Это не должно влиять на модель домена.

Не влияя на агрегат, я предполагаю, что вы имеете в виду частные переменные внутри самого агрегатного класса? Если вы имели в виду что-то другое, игнорируйте этот ответ.

Я нахожу, что разработчики, которые впервые внедряют ES, склонны бороться с этим вопросом. В первый раз, когда я сделал сквозную ссылочную реализацию, у меня был точно такой же вопрос.

Я был действительно удивлен, обнаружив, что локальное агрегатное состояние не так полезно, как я думал-это состояние почти всегда более естественно выражалось в виде проецируемых читаемых моделей. Единственное время, когда выдействительно нуждаетесь в локальном состоянии, - это когда требуется обработать отдельное событие (например, для проверки).

Поэтому я бы сказал, что не только допустимо поддерживать события, которые не изменяют локальное агрегатное состояние, эти типы событий, возможно, более распространены, чем события, которые изменяют локальное состояние.