Доменные запросы в CQRS - PullRequest
       30

Доменные запросы в CQRS

24 голосов
/ 06 января 2010

Мы пробуем CQRS . У нас есть ситуация проверки, когда CustomerService (служба домена) должна знать, существует ли Клиент. Клиенты уникальны по их адресу электронной почты. Наш репозиторий Customer (универсальный репозиторий) имеет только Get (id) и Add (customer). Как Служба CustomerService узнает, существует ли Клиент?

Ответы [ 4 ]

24 голосов
/ 07 января 2010

Посмотрите на это сообщение в блоге: Установите проверку на основе в архитектуре CQRS .

Это решает эту самую проблему. Это сложная проблема в CQRS. Bjarte предлагает запросить базу данных отчетов о существующих адресах электронной почты Клиента и выполнить Компенсационную Команду (например, CustomerEmailAddressIsNotUniqueCompensatingCommand) обратно в Модель Домена, если адрес электронной почты был найден. Затем вы можете запустить соответствующие события, которые могут включать UndoCustomerCreationEvent.

Прочтите комментарии к вышеуказанному сообщению в блоге для альтернативных идей.

Адам Д. предполагает в комментарии, что проверка является проблемой домена. В результате вы можете хранить ReservedEmailAddresses в службе, которая облегчает создание клиентов и управляется событиями в вашем хранилище событий.

Я не уверен, что есть простое решение этой проблемы, которое кажется совершенно чистым. Дайте мне знать, что вы придумали!

Удачи!

5 голосов
/ 28 мая 2010

Это сообщение Уди Дахана http://www.udidahan.com/2009/12/09/clarified-cqrs/ содержит следующий абзац:

"Кроме того, нам не нужно обращаться к хранилищу запросов для обработки команд - любое необходимое состояние должно управляться автономным компонентом - это часть значения автономии."

Я полагаю, что Уди предложил просто добавить уникальное ограничение в базу данных.

Но если вам не хочется делать это, основываясь на приведенном выше заявлении, я бы предложил просто добавить метод «ByEmail» в репозиторий и покончить с ним - но с другой стороны, у Udi, вероятно, будет лучшее предложение. .

5 голосов
/ 04 мая 2010

Этот вопрос не должен быть таким сложным:

  1. Перед отправкой команды UpdateCustomer проверьте свое хранилище отчетов на уникальность клиента.
  2. Добавьте ограничение в вашу БД на уникальность адреса электронной почты. При выполнении команды обработайте исключение и отправьте уведомление пользователю, используя канал ответа. (он никогда не запускает события CustomerUpdated в хранилище отчетов.

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

2 голосов
/ 03 сентября 2013

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

Таким образом, в этом случае у нас может быть класс с именем CustomerEmailMustBeUniqueRule, который выбирается RuleEngine, когда команда «RegisterCustomerCommand» собирается выполнить RegisterCustomerCommandExecutor. Этот класс правил отвечает за запрос к базе данных, чтобы определить, существует ли идентификатор электронной почты, и остановить выполнение, подняв недопустимый флаг ...

...