CQRS - как обрабатывать, если команде требуются данные из базы данных (запрос) - PullRequest
0 голосов
/ 30 января 2020

Я пытаюсь обернуть голову вокруг наилучшего способа решения этой проблемы. Я импортирую файл, содержащий группу пользователей, поэтому я создал обработчик с именем ImportUsersCommandHandler, и моя команда - ImportUsersCommand, в качестве одного из параметров List<User>.

В обработчике для каждого пользователя что мне нужно импортировать, я должен убедиться, что UserType является действительным, вот где возникает путаница. Мне нужно сделать запрос к базе данных, чтобы получить список всех возможных типов пользователей и, чем для каждого пользователя я импортирую, я хочу убедиться, что user type id в импорте совпадает с тем, что находится в БД.

У меня есть 3 варианта.

  1. Создать запрос GetUserTypesQuery и получите остальную часть этого и затем передайте его в ImportUsersCommand в виде списка и проверьте внутри обработчика команды
  2. Вызовите GetUserTypesQuery из самой команды и не передавайте ее (команда, вызывающая другой запрос)
  3. Не создавайте GetUsersTypeQuery, а просто делайте результаты запроса внутри команды (все еще запрос, но без запроса / обработчика)

Мне кажется, что все это грязные решения, а не Corre ct способ применения CQRS.

1 Ответ

0 голосов
/ 10 марта 2020

Я согласен, вариант 1 звучит лучше, но, возможно, предложит добавить обработчик pre для проверки вашего ввода?

Так что ImportUsersCommandHandler имеет дело с импортом ваших данных (и только это) и добавить обработчик, который запускается до того, как он проверяет (в вашем примере проверяет пользовательские типы и, возможно, другие вещи) и выдает из него выход, не проходит. Таким образом, он запрашивает базу данных, проверяет пользовательские типы и делает все, что ему нужно, в случае неудачи. В противном случае он просто передается вашему обработчику business (ImportUsersCommandHandler).

Я привык использовать Mediatr в NET Core, и этот шаблон работает хорошо (это то, что мы делаем), так что извините если это не соответствует вашей среде / настройке!

...