#c# #validation #cqrs
#c# #проверка #cqrs
Вопрос:
В моей архитектуре CQRS я хотел бы подтвердить, что когда я отправляю InsertSettingCommand (параметр — это объект key / value), я хочу проверить, что ключ еще не существует в моей базе данных. Если я хорошо понимаю CQRS amp; validation, там говорится, что проверка должна выполняться на стороне клиента только тогда, когда речь идет о проверке некоторых элементов форматирования, таких как проверка того, что электронная почта соответствует некоторому синтаксису или что имя клиента не пустое. Но в моем случае мне нужно запросить мою базу данных, чтобы узнать, существует ли она, но я не знаю, правильно ли запрашивать мое хранилище для чтения на стороне клиента? Или мне следует вызвать хранилище для чтения на стороне моего домена? Затем генерируется событие InsertSettingDuplicated ?
Итак, какой наилучший подход в моей ситуации в среде CQRS? Некоторые люди говорят о компенсирующих действиях? Это что-то, что может мне помочь?
Спасибо.
Ответ №1:
Можно выполнить запрос со стороны клиента для чтения хранилища, чтобы проверить уникальность. Вот некоторые мысли Грега Янга о проверке на основе наборов с использованием CQRS.
Ответ №2:
- Используйте «компенсирующие действия», если вам нужно исправить некоторые неправильные команды, которые нарушают работу вашего хранилища для чтения / записи.
- Обычно для проверки чего-либо перед отправкой команды используется хранилище для чтения, без сомнения, для отправки действительной команды.
Ответ №3:
Теоретически, вам не нужно даже проверять наличие дубликата ключа, ваша клиентская сторона должна быть подключена для получения такой информации самостоятельно, полностью сегментированной из пользовательского ввода. Например: создайте список таких элементов в выпадающем списке или любой другой выборочный список.
Компенсирующие действия или команды компенсации следует использовать только тогда, когда системе не удалось выполнить процесс, и, следовательно, ей приходится откатывать несколько команд или что бы это ни было сделано при сборке до точки сбоя.
Допустим, например, что система должна вставить параметр, единственное событие, которое должна быть способна вызвать эта команда, должно быть чем-то вроде ‘SettingInsertedEvent’. Итак, предположим, что это событие не было вызвано, затем мы можем дать системе указание компенсировать это и откатить все, что она сделала в рамках этого процесса.
Ваша команда также могла бы реализовать интерфейс, который выполняет проверку за вас через DataManager. Или вы могли бы просто создать модель данных без ключа и сделать автоматическое увеличение таблицы, чтобы вам даже не пришлось полностью беспокоиться о сценарии. (Я уверен, что вы уже знаете, что DataModel — это просто кодовое представление существующей таблицы на вашем сервере БД, связанное с ней ORM, другой фундаментальной частью любого современного приложения.)