В настоящее время у меня есть один поток событий на каждый корень корня и два элемента счисления, Room
и RoomType
.Комбинированная связь
Поведение Room
зависит от того, что такое RoomType
. Чтобы разделить оба агрегата, RoomType
представлен только как roomTypeId в совокупности Room
. Изменение RoomType
представлено мероприятием RoomTypeChanged
.
RoomTypes
может управляться отдельно и нуждается в другом агрегате.
Теперь рассмотрим следующий случай использования:
Когда пользователь аннулирует в RoomType
, все Rooms
, что есть, что Roomtype
должен переключиться на запасной вариант RoomType
.
Я думал несколько подходов, но все они кажутся проблематичными:
Есть ли прослушиватель события прослушайте
RoomTypeInvalidated
-Event, и отправитьSwitchToFallbackRoomType
на всехRoom
-aggregates, которые имеют чтоRoomtype
. Как бы это сделать? Невозможно узнать, у каких агрегатов естьRoomtype
, если я не получу доступ к моей readmodel, которая кажется неправильной. Даже если бы я загружал все агрегаты, невозможно загрузить только агрегаты этого типа, так как я не могу загрузить подмножество всех потоков (используя geteventstore).Когда на
RoomTypeChanged
повторное -СОБЫТИИ кRoom
агрегату, вместо того, чтобы просто применить его, сделать проверку, чтобы убедиться в том, что до сих пор существуетRoomType
, но опять-таки, как бы я знать, какиеRoomTypes
существуют (я бы в такая же ситуация, как 1, но инвертированная)? Кроме того, кажется неправильным вводить логику в повторное использование событий, они должны просто представлять изменения состояния, я думаю.
Как вы решите это?
Проблема с диспетчером процесса в каждом номере - как это состояние обновляется. Если вы обновите его в той же команде, которая создает комнату, теперь вам нужны транзакции, чтобы гарантировать, что состояние БД остается согласованным (у вас есть 2 операции записи: комната и менеджер). Если, с другой стороны, вы обновляете диспетчер процессов из обработчика событий, то у вас есть другая версия той же проблемы, о которой упоминалось OP –