Путь 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
Эффект в том, что он будет либо заполнить Ручей с помощью Записывает, что он найден в сохранении, или если ни один не найден, он ничего не сделает и вернет новый поток.
Однако вам не придется задавать себе этот вопрос. Перед отправкой необходимо выполнить проверку. Используйте ваши прочитанные модели для проверки команды перед ее отправкой.
Кроме того, команда с объединенным корневым состоянием должна быть достаточной для выполнения вашего решения в домене. Это в основном означает, что вы должны быть уверены в состоянии домена перед отправкой своих команд, чтобы избежать исключений в домене. И вы можете использовать для этого модель чтения.
Update в ответ на Mauros комментарий:
Вы испытываете проблемы параллелизма. Возможно, вы сможете решить эту проблему, используя метод, используемый в случайно соединенных системах, которые объединяются. Что вы можете сделать, так это сохранить версию Stream в модели чтения, чтобы вы знали, какую ревизию AR вы действовали. Затем, когда команда обрабатывается, вы знаете, действуете ли вы на прежнее состояние AR.
Если ревизия AR выше, чем та, которую приносит команда, вы можете либо отбросить команду как отказ (пессимистический параллелизм), либо попытаться объединить изменения.
Это можно сделать, просмотрев события, произведенные в результате ревизии в команде, до текущего состояния. Затем вызовите поведение, которое должна была выполнить команда, и посмотрите на события, созданные этим поведением, и сравните две коллекции событий. Если конфликтующих событий нет, вы можете зафиксировать вновь созданные события в хранилище. Если есть конфликты, вы можете бросить исключение параллелизма.
Я думаю, что это ваш лучший выбор для решения таких проблем параллелизма.
Поиск слияния событий для получения дополнительной информации.
«Команда должна быть проверена перед отправкой» .. что, если прочитанная модель «устарела», потому что другой клиент отправляет событие настойчивость? Я борюсь с этой проблемой –
Я обновил ответ, поскольку он не подходит для поля комментариев, хотя, возможно, лучше было бы использовать отдельный вопрос. –
@ MikaelÖstberg: Большое вам спасибо за информацию. На данный момент я не использовал EventStoreRepository напрямую, так как я все еще изучаю CQRS, и у меня возникали проблемы с CommonDomain. Знаете ли вы о каких-либо проектах/шип-кодах, которые используют CommonDomain? –