Скажем, я использую источник событий, и мой агрегат root (match) строит свое состояние из событий "PlayerWonPoint" и "PlayerLostPoint" (у него также есть две соответствующие команды). Если упрощено, состояние изменяется от InProgress до Final . Читающая сторона отвечает за представление истории очков и некоторых статистических данных. Например, для тенниса точки будут представлены в виде
MatchStarted -> 0-0
PlayerWonPoint -> 15-0
PlayerLostPoint -> 15-15
PlayerWonPoint -> 30-15
PlayerWonPoint -> 40-15
PlayerWonPoint -> Player won the game
- Должен ли я сказать модели чтения (используя данные о событиях), каково текущее представление счета, поэтому модель чтения примет это как дано и просто добавит к столу? В этом случае сторона чтения очень проста, но мы добавляем некоторые дополнительные данные в исходные события, которые на самом деле не требуются для самого агрегата.
- Или мы можем позволить стороне Read вычислить представление результатов? Для этого потребуется дополнительная логика c, которая будет очень похожа на то, что используется в агрегате для отслеживания его текущего состояния.
Другой вопрос: если игрок выигрывает точку, а агрегат видит, что это GamePoint , SetPoint или MatchPoint , могу ли я записать другой тип события для этого или я просто продолжаю использовать только PlayerLostPoint / PlayerLostPoint события? Потому что, опять же, агрегат может повторно гидратироваться из последних двух типов событий. Но с только двумя типами событий считывание модели становится еще более сложным (т.е. необходимо отслеживать игры, наборы и т. Д. c.). Я не вижу большого вреда, добавляя дополнительные четные типы для упрощения ReadModel, потенциально дополнительные типы событий могут быть полезны и для агрегата, например, он может пропустить обработку событий всех точек, если последнее событие точки равно PlayerWonTheMatch? *