Обычно у меня будет 5-6 событий на совокупность, и я бы не хотел хранить прогнозы в БД. Что было бы самым простым способом всегда делать проекцию представления во время запроса?
Короткий ответ на это заключается в том, что нет простого/быстрого способа сделать это.
Тем не менее, безусловно, можно реализовать настройку «воспроизведение заданных событий во время запроса».
То, что я предлагаю вам сделать, состоит из нескольких шагов:
@EventHandler
аннотированные методы в модели)@QueryHandler
.EventStore
. Если это основано на aggregateIdentifier
, используйте метод EventStore#readEvents(String)
. Если вам нужен весь поток событий, вам нужно использовать метод StreamableMessageSource#openStream(TrackingToken)
(примечание: интерфейс EventStore
реализует StreamableMessageSource
)AnnotationEventHandlerAdapter
, предоставив ему новый экземпляр вашей модели запроса.AnnotationEventHandlerAdapter#handle(EventMessage)
. Этот метод будет вызывать аннотированные методы @EventHandler
для вашего объекта модели запроса.Итак, опять же, я не думаю, что это слишком тривиально, легко или быстро настроить. Кроме того, в шаге 3 есть небольшая оговорка. Получение потока данного Агрегата на основе Идентификатора Агрегата выполняется довольно быстро/кратко, поскольку Агрегат обычно не имеет большого количества событий.
Однако извлечение потока событий на основе TrackingToken
, которое вам понадобится, если ваша модель запроса охватывает несколько агрегатов, может гарантировать, что вы извлечете хранилище событий весь для создания экземпляров ваших моделей на лету. Конечно, вы можете точно настроить момент времени, когда вы хотите, чтобы поток событий возвращал события, поскольку вы имеете дело с TrackingToken
, но изменения довольно велики, вы будете неполными и относительно медленными.
Однако вы заявили, что хотите получить события для данного совокупного идентификатора. Таким образом, я думаю, что это должно быть работоспособным решением в вашем сценарии.
Надеюсь это поможет!
Исходя из определения хранилища событий, обычно следует ожидать два способа получения событий из него: один для каждого совокупного идентификатора, а два — для потока событий в данный момент времени. Следовательно, мой аргумент о том, что это будет хорошо работать для View per Aggregate Id, но не так хорошо для других перестановок. Не совсем уверен, является ли это отсутствующей функцией или просто соответствует определению магазина событий. В любом случае, вы всегда можете отправить запрос на добавление функций для Axon: github.com/AxonFramework/AxonFramework/вопросы.
спасибо за описание способа сделать это. Похоже, что-то, что вообще не поддерживается в Axon. Проблема с этой реализацией заключается в характере событий - проекции должны содержать все события (в основном проекция имеет только List<Event> eventHistory), что делает непрактичным хранение проекций (поскольку на самом деле это будут дублирующиеся события).