Намерение команд и событий в CQRS с ES - PullRequest
4 голосов
/ 07 декабря 2011

Мой вопрос связан с этим . Хотя соответствующий вопрос и ответы показывают, почему мы хотим разделить их, я хотел убедиться, что мое понимание намерения было правильным. Во всех примерах, которые я видел, цель команды состоит в том, чтобы ее можно было отклонить и обновить объект в памяти, а затем событие обновит базу данных. Теперь я знаю, что сильно упрощаю, но правильно ли понимать, что команды предназначены для обновления памяти, а события для обновления БД? Если нет, то кто-нибудь может уточнить для меня.

Я пытаюсь выучить эти паттерны, и вот как я понимаю это до сих пор, и я хочу убедиться, что это правильно. Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 08 декабря 2011

Ваше понимание верно.

Команды выдаются для модели домена и запрашивают определенное поведение. Модель предметной области проверяет, разрешено ли выполнение, и ведет себя соответственно. Команды можно рассматривать как особый вариант использования, который должен быть выполнен.

События с другой стороны просто объявляют, что что-то уже произошло (их нельзя отклонить, так как вы не можете изменить прошлое.)

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

В частности, когда применяется шаблон Event Sourcing , тогда Events - это то, что сохраняется и воспроизводится для повторной гидратации модели вашего домена при необходимости.

4 голосов
/ 08 декабря 2011

Во-первых, я не думаю, что вы слишком упрощаете это. Это простая концепция.

Команды говорят вашему приложению что-то делать.

События объявляют миру, что вы что-то сделали.

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

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

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

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

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

Позже, когда вам понадобится ваш пользовательский объект, вы будете вызывать что-то вроде _repo.GetById (1);

Затем будут воспроизведены все события, связанные с этим пользователем, и создан объект пользователя.

Надеюсь, это поможет:)

...