Я пытаюсь изучить способы DDD и смежных предметов. Мне пришла в голову идея простого ограниченного контекста для реализации «банка»: есть счета, деньги можно вкладывать, снимать и переводить между ними. Также важно вести историю изменений.
Я идентифицировал сущность Аккаунта, и было бы полезно отслеживать события в нем. Другие сущности или объекты-значения не имеют отношения к проблеме, поэтому я не буду их упоминать.
При рассмотрении депозитов и выводов - это относительно просто, потому что изменен только один агрегат.
При переводе это отличается - два агрегата должны быть изменены одним событием MoneyTransferred . DDD не поддерживает изменение нескольких агрегатов в одной транзакции. С другой стороны, правило источника событий заключается в применении событий к сущностям и изменении их состояния. Если бы событие могло быть просто сохранено в базе данных, проблем не было бы. Но чтобы не допустить одновременного изменения объектов, полученных из событий, мы должны реализовать что-то для управления версиями потока событий каждого агрегата (чтобы сохранить границы транзакций). С версионностью возникает другая проблема - я не могу использовать простые структуры для хранения событий и их чтения, чтобы применить их к агрегированию.
Мой вопрос - как я могу объединить эти три принципа: «одна совокупность - одна транзакция», «событие -> изменение в совокупности» и «предотвращение одновременных изменений»?