Во-первых, я не думаю, что вы слишком упрощаете это. Это простая концепция.
Команды говорят вашему приложению что-то делать.
События объявляют миру, что вы что-то сделали.
Если ваше приложение не может делать то, что ему приказано (из-за бизнес-правил или по какой-либо другой причине), оно этого не делает. И в свою очередь ничего не объявляет. Если он что-то делает, он объявляет об этом через событие.
Если кто-то подписан на эти события и заботится о том, когда они происходят, он может обновить свое приложение, указав данные в этом событии.
На практике это обычно означает, что ваша модель чтения подписывается на события и соответствующим образом обновляется.
Возьмите создание пользователя. Вы запускаете User_CreateCommand, который содержит информацию о пользователе. Затем обработчик команды создаст новый объект, этот объект будет пользователем, и сохранит его в хранилище. Создание пользователя запускает User_CreatedEvent, который будет обрабатываться вашей моделью чтения, и модель чтения будет обновлена. Любые другие системы прослушивания также могут обновляться.
Часть, которая требует небольшого изучения, заключается в том, что когда вы сохраняете своего пользователя в хранилище, вы на самом деле не сохраняете объект пользователя, как вы думаете. Вы на самом деле сохраняете User_CreatedEvent, который содержит все данные о пользователе.
Позже, когда вам понадобится ваш пользовательский объект, вы будете вызывать что-то вроде _repo.GetById (1);
Затем будут воспроизведены все события, связанные с этим пользователем, и создан объект пользователя.
Надеюсь, это поможет:)