Я реализую ограниченный контекст, используя источник событий, но столкнулся с проблемой. Скажем, я моделирую игру в футбол, и меня интересуют как отдельные забитые голы (кто их забил и т. д.), так и общий счет. Поэтому, если у меня есть корень агрегата Match, я в идеале хочу, чтобы события вызывались с именами GoalScored и ScoreChanged. Причина, по которой я хочу, чтобы оценка явно указывалась из домена, заключается в том, что я не хочу, чтобы много разных слушателей и, возможно, других ограниченных контекстов вычисляли одно и то же.
Это кажется простым, но: объект Match имеет метод Goal(), который добавляет новую цель. В духе источника событий это не изменяет состояние Match напрямую, а вызывает событие GoalScored, которое обрабатывается в Match, которое затем изменяет состояние (а также событие, передаваемое денормализаторам). Таким образом, с точки зрения повышения ScoreChanged, счет фактически не изменился, пока не было обработано событие GoalScored, поэтому я должен вызвать другое событие в ответ на это событие (ScoreChanged), эффективно связывая события? Я так не думаю, для начала, когда совокупный корень перезагружается из хранилища событий, каждый раз будет создаваться множество дополнительных событий в ответ на каждый GoalScored.
Я также подумал о том, чтобы выяснить, какой счет будет в обработчике команд, который повышает GoalScored, что-то вроде ситуации «что, если». Затем я мог вызвать оба события в обработчике команд. Хотя я бы предпочел этого не делать - это просто не кажется "правильным". Вычислить счет в футболе достаточно просто, но в других играх (например, в крикете) требуется больше усилий.
Я мог бы поместить и гол, и счет в событие GoalScored, что достаточно справедливо, но опять же это не кажется правильным - счет не имеет ничего общего с событием GoalScored как таковым.
Во всех примерах, используемых при обсуждении источников событий, похоже, используется домен электронной коммерции «Клиент/Заказ», и я никогда не видел подобного случая.
У кого-нибудь есть опыт решения подобных ситуаций?
Спасибо