Идея, лежащая в основе Event Sourcing вашего Aggregate, заключается в том, что эти события являются источником любой модели в вашей системе.
Таким образом, если вы создаете выделенную модель команд, обрабатывающую такие команды, какВы описываете, тогда эта модель (которая с точки зрения Аксона является классом аннотаций @Aggregate(Root)
) будет получена из событий, которые она опубликовала.
Кроме того, вы можете ввести любой тип запроса Модель, которую вы хотите;представление СУБД, решение для поиска по тексту (например, Elastic), база данных временных рядов, назовите ее. Любая из этих моделей запросов, тем не менее, по-прежнему является частью того же корневого приложения, в котором находится ваш агрегат. Поскольку у вас есть события как средство уведомления других о принимаемых решениях, естественно (их) использовать (обновить) для обновления всех ваших моделей запросов. а также.
Теперь совершенно верно, что вы не склонны использовать Event Sourcing для ваших агрегатов в Axon, который с его точки зрения называется State-Stogregated . Однако, если вы сделаете это, вы вернетесь к созданию разных моделей в отдельном механизме хранения без единого источника истины .
Итак, вернемся к вашему вопросу с этим добавленнымзнание, я бы сказал следующее:
Например, когда я должен вручную воссоздать агрегат?
Вы никогда не склонны воссоздавать агрегат как модель команд, когда-либо, так как рамки делают это для вас. Если у вас есть зеркальный агрегат модели запросов, вы будете воссоздавать его всякий раз, когда добавляете / удаляете / изменяете поля в модели. Или, если вы представили совершенно новые модели.
В чем преимущество воссоздания агрегата каждый раз, когда я вызываю команду?
Преимущество воссоздания каждоговремя, это гарантия того, что вы всегда будете использовать последнее состояние. Даже если между выпуском вашего приложения вы добавили / изменили / удалили новые поля. Аннотированные методы @EventSourcingHandler
просто заполнили бы их без необходимости, например, писать сценарий базы данных, чтобы напрямую настраивать его на уровне базы данных.
В заключение, причина этого подходаполностью в рамках архитектурных концепций, поддерживаемых через Axon. Вы можете прочитать их на странице AxonIQ Architectural Concepts , если хотите;Я уверен, что это прояснит ситуацию еще дальше.
Надеюсь, это поможет вам @ Gisrou8! Если нет, пожалуйста, возвращайтесь с дополнительными вопросами, я с удовольствием объясню подробнее.
Обновление: дальнейшее объяснение модели команд
В комментарииGisrou8, помещенный под мой ответ, становится очевидным, что «неудобство» с этим подходом главным образом находится в состоянии Агрегата.
Как указывалось в моем предыдущем ответе, Агрегат, который можно смоделировать с помощью Axon Framework, должен быть:в настройке Event Sourced, рассматриваемой в качестве модели команд в системе CQRS.
Одним из главных столпов вокруг модели команд является то, что содержащееся в нем состояние only является требуемым состояниемдля логики принятия решений. Если говорить более конкретно о последнем, единственное состояние, хранящееся в вашем агрегате, - это состояние, используемое для определения, должен ли обработчик команд принимать входящую команду и публиковать в результате событие.
Таким образом, единственные поля, которые выВ вашей совокупности наряду с Идентификатором совокупности будут указаны поля, необходимые для принятия этих решений. Это то, для чего предназначена модель команд, поэтому не беспокойтесь об этом.
Чтобы ответить на любые запросы в вашем приложении, вы должны ввести специальную модель запросов, которая обновляется в результате опубликованных событий. обработчиками команд в агрегате. Именно эта сегрегация является сильной стороной этой модели, поскольку она позволяет лучше масштабировать, улучшать производительность или требовать разделения команды среди других нефункциональных требований.