Таким образом, мы договорились, что вы пытаетесь создать потоки событий в массивах DDD Aggregate Root и Aggregate.
Существует общий шаблон, в котором каждый агрегат имеет свой собственный поток. Он имеет имя и идентификатор совокупного корня, хотя часть имени не является обязательным требованием.
Все операции над всей совокупностью представлены событиями, которые затем записываются в этот поток.
Поэтому, если у вас есть сводный корень MyNamespace.Order
, который имеет несколько объектов или объектов дочернего значения MyNamespace.OrderLine
, все операции над линиями выполняются путем доступа к агрегированным корневым методам, и все события записываются в один поток, поэтому для заказа с идентификатором 123 было бы:
поток: MyName
- space.Order-123
- OrderPlaced
- OrderDeliveryAddressSet
- OrderLineAdded
- OrderLineAdded
- OrderLineRemoved
- OrderConfirmed
- OrderETASet
- OrderPaid
- OrderDispatched
- OrderDelivered
Понятие субъектов не представлена на стороне магазина событие, так как вы c annot легко определяет отношения между различными потоками, чтобы читать события из нескольких потоков, чтобы перекомпилировать совокупность. Поэтому все события записываются и считываются в совокупном корневом потоке, который затем становится потоком для всего агрегата.
Важным правилом в отношении агрегатов является то, что совокупность также является границей согласованности. Это в основном означает, что все операции над агрегатом должны выполняться в одной транзакции.
Важно, чтобы версия события обрабатывала параллелизм. Когда вы читаете агрегат из хранилища событий, вы также получаете последнюю версию события. После выполнения операции вы пишете новые события, проверяя, остается ли последняя версия события одинаковой. Если последняя версия события не соответствует, вы бросаете исключение параллелизма, поскольку кто-то уже изменил агрегат и написал изменения в хранилище до того, как вы это сделали, и у вас возник конфликт.
Относительно "таблиц" Я не совсем уверен, что вы имеете в виду. Конечно, вы можете смоделировать хранилище событий в таблицах, и при этом есть разные стратегии. Чаще всего вам не нужно использовать специализированный магазин событий, например this one.
Вы говорите об Агрегате и Агрегате корневых шаблонов DDD? Они имеют мало общего с Event Sourcing. –
Да, я читал, что сами модели DDD не связаны с источником событий, но Грег Янг часто обсуждает и документирует эти два вместе. Таблица (ы), о которой идет речь, имеет отношение внешних ключей к таблице событий в представленных примерах. http://danielwhittaker.me/2014/11/15/aggregate-root-cqrs-event-sourcing/ https://cqrs.wordpress.com/documents/building-event-storage/ – webish