Как работает EventStore на данный момент, вы создадите новый поток (агрегатный корень), если поток не найден.
Проверьте эту строку: https://github.com/joliver/CommonDomain/blob/master/src/proj/CommonDomain.Persistence.EventStore/EventStoreRepository.cs#L53
Он вызывает этот метод в Магазине: https://github.com/joliver/EventStore/blob/master/src/proj/EventStore.Core/OptimisticEventStore.cs#L45
Который вызывает этот конструктор: https://github.com/joliver/EventStore/blob/master/src/proj/EventStore.Core/OptimisticEventStream.cs#L27
Эффект заключается в том, что он либо заполнит поток, используя коммиты, найденные в постоянстве, либо, если ничего не будет найдено, он ничего не сделает и вернет новый поток.
Однако не стоит задавать себе этот вопрос. Команда должна быть проверена перед отправкой. Используйте свои модели чтения для проверки команды перед ее отправкой.
Кроме того, команда вместе с совокупным корневым состоянием должна содержать достаточно информации для выполнения вашего решения в домене. В основном это означает, что вы должны быть уверены в состоянии домена, прежде чем отправлять свои команды, чтобы избежать исключений в домене. И вы можете использовать модель чтения для этого.
Обновление в ответ на комментарий Мауроса:
У вас проблема с параллелизмом. Возможно, вы сможете решить эту проблему, используя метод, используемый в случайно соединенных системах, которые объединяются. Что вы можете сделать, так это сохранить версию Stream в модели чтения, чтобы вы знали, с какой версией AR вы действовали. Затем, когда команда обрабатывается, вы знаете, действовали ли вы в старом состоянии AR.
Если версия AR выше, чем та, которую приносит команда, вы можете либо отменить команду как неудачную (пессимистический параллелизм), либо попытаться объединить изменения.
Это можно сделать, просмотрев события, созданные от ревизии в команде до текущего состояния. Затем вызовите поведение, которое должна была выполнить команда, и просмотрите события, созданные этим поведением, и сравните две коллекции событий. Если конфликтующих событий нет, вы можете зафиксировать вновь созданные события в хранилище. Если есть конфликты, вы можете создать исключение параллелизма.
Я думаю, что это лучший способ решить проблемы параллелизма такого типа.
Найдите объединение событий для получения дополнительной информации.
person
Mikael Östberg
schedule
31.01.2012