Побочные эффекты в источнике событий - PullRequest
0 голосов
/ 24 февраля 2019

Допустим, у меня есть следующие отношения):

Aggregate A (contains E1, E2, E4)
 - Entity of type E1
 - Entity of type E2 (contains E3)
   - Sub-entity of type E3
 - Entity of type E4

Все сущности реализуют следующую подпись:

fun handleCommand(command: Command): List<Event> // returns a list of events that can be applied on itself
fun handleEvent(event: Event): Entity // returns itself with the new event applied

При обработке команды, скажем, E4, которая должна логическивызвать какой-либо побочный эффект (события) на E2, какова лучшая практика?Обратите внимание, что это не следует путать с сагами, но это скорее общий вопрос о том, как должны возникать побочные эффекты на родительских объектах при обработке команды на дочернем объекте.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Литература довольно слаба по нетривиальным агрегатам.

При обработке команды, скажем, E4, это должно логически вызывать побочный эффект (события) на E2, что является лучшимпрактика?

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

Когда мы восстанавливаем сущности из их истории, бизнес-правила больше не применяются -каждое состояние объекта получается из его собственных событий в отдельности.

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

Поскольку состояния объекта логически изолированы друг от друга, порядок событий не имеет особого значения - поведение объекта является параллельным.Каждая сущность должна видеть свои собственные события в «правильном» порядке, но это не имеет особого значения, если сущность E4 воссоздается из ее событий до или после E2.

(Порядок событий в одной сущности все еще можетбыть актуальным.)

0 голосов
/ 25 февраля 2019

Это точка совокупности.Было бы координировать этот процесс.Внешний код не сможет выдать команду непосредственно на E4, поскольку он будет инкапсулирован в Aggregate.Скорее команда будет перенаправлена ​​на агрегат, и агрегат выдаст и скоординирует процесс внутри.

Надеюсь, что поможет

...