CQRS Валидация и уникальность - PullRequest
7 голосов
/ 26 мая 2011

В моей архитектуре CQRS я хотел бы проверить, что при отправке InsertSettingCommand (параметр является объектом ключ / значение), я хочу проверить, что ключ еще не существует в моей базе данных.Если я хорошо понимаю CQRS и валидацию, это говорит о том, что валидация должна выполняться на стороне клиента только тогда, когда речь идет о проверке некоторых элементов форматирования, таких как проверка того, что электронная почта соблюдает некоторый синтаксис или имя клиента не пустое.Но в моем случае мне нужно сделать запрос к моей базе данных, чтобы увидеть, существует ли она, но я не знаю, правильно ли делать запрос к моему хранилищу чтения на стороне клиента?Или я должен позвонить в мой магазин чтения на моей стороне домена?Затем создает событие InsertSettingDuplicated?

Так какой же подход лучше использовать в моей ситуации в среде CQRS?Некоторые люди говорят о компенсирующих действиях?Это может мне чем-то помочь?

Спасибо.

Ответы [ 3 ]

9 голосов
/ 26 мая 2011

Можно сделать запрос со стороны клиента для чтения хранилища, чтобы проверить уникальность. Вот некоторые мысли Грега Янга о проверке на основе множеств с использованием CQRS.

3 голосов
/ 17 июня 2011
  1. Используйте «компенсирующие действия», если вам нужно исправить некоторые неправильные команды, которые ломают ваше хранилище для чтения / записи.
  2. Разумно использовать чтение хранилища для проверки чего-либо перед отправкой команды, чтобы, без сомнения, отправить действительную команду.
1 голос
/ 11 июля 2017

Теоретически вам даже не нужно проверять наличие дубликата ключа, ваша клиентская сторона должна быть подключена для самостоятельного извлечения такой информации, полностью сегментированной из пользовательского ввода.Например: иметь список таких элементов в раскрывающемся списке или любой другой выборочный список.

Компенсационные действия или компенсационные команды следует использовать только в том случае, если система не смогла выполнить процесс , и, таким образом, ей необходимо откатить несколько команд или все, что было сделано при сборке, до сбоя.точка.

Например, предположим, что система должна вставить параметр, единственное событие, которое должна вызывать эта команда, должно быть что-то вроде «SettingInsertedEvent».Итак, предположим, что это событие не было инициировано, и мы можем дать команду системе компенсировать это и откатить все, что было сделано в этом процессе.

Ваша команда может также реализовать интерфейс, который выполняет проверку для вас черезDataManager.Или вы можете просто создать dataModel без ключа и сделать автоинкремент таблицы, чтобы вам даже не пришлось полностью беспокоиться о сценарии.( Я уверен, что вы уже знаете, что dataModel - это просто кодовое представление существующей таблицы на вашем сервере баз данных, связанной с ней ORM, еще одной фундаментальной частью любого современного приложения. )

...