CQRS - как обработать, если команде требуются данные из базы данных (запрос)

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

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

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

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

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


person Zoinky    schedule 30.01.2020    source источник
comment
Я думаю, что первый вариант - лучшее решение.   -  person Morilog    schedule 02.02.2020
comment
В этом сообщении SoftwareEngineering может быть некоторая полезная информация по этой теме: Как проверить команду перед выполнением на агрегате, когда для проверки необходимо запросить данные?   -  person Nope    schedule 03.03.2020


Ответы (1)


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

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

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

person PaulD    schedule 09.03.2020