У меня есть довольно простая модель предметной области, включающая список Facility
совокупные корни. Учитывая, что я использую CQRS и шину события для обработки событий, сгенерированных от домена, как Вы могли обработать проверку на наборах? Например, скажите, что у меня есть следующее требование:
Facility
должен иметь уникальное имя.Так как я использую в конечном счете последовательную базу данных по стороне запроса, данные в ней, как гарантируют, не будут точны в то время, когда событие processesor обрабатывает событие.
Например, a FacilityCreatedEvent
находится в очереди обработки событий базы данных запроса, ожидающей, чтобы быть обработанным и записанным в базу данных. Новое CreateFacilityCommand
отправляется в домен, который будет обработан. Доменные сервисы запрашивают базу данных чтения, чтобы видеть, существует ли кто-либо другой Facility
зарегистрированный уже в том имени, но возвращает false потому что CreateNewFacilityEvent
еще не был обработан и записан в хранилище. Новое CreateFacilityCommand
теперь успешно выполнится и подбросит другого FacilityCreatedEvent
который аварийно завершился бы, когда процессор события пытается записать это в базу данных и находит что другой Facility
уже существует с тем именем.
Решение, которое я выбрал, заключалось в добавлении агрегированного корня System
, который мог бы поддерживать список текущих имен Facility
. При создании нового объекта
я использую агрегат System
(только один System
как глобальный объект / синглтон) в качестве его фабрики. Если данное название объекта уже существует, то будет выдана ошибка проверки.
Это сохраняет ограничения проверки в пределах домена и не полагается на в конечном итоге согласованное хранилище запросов.