Axonframework, как я могу применить ту же проверку состояния к каждой функции

#spring-boot #kotlin #axon

#весенняя загрузка #kotlin #axon

Вопрос:

Итак, в настоящее время я разрабатываю приложение, используя Spring boot с Axonframework, поэтому в Axonframework есть нечто, называемое aggregate. Он может хранить некоторые состояния и т. Д. Все работает нормально, но есть случай, когда я должен проверять одно и то же состояние для каждой входящей команды, прежде чем обновлять агрегат. Что-то вроде этого

 @CommandHandler
fun handle(command: UpdateProductCommand){
  if (isProductApproved){
    throw IllegalArgumentException("This product has not been approved by qa.")
  }
  ... do something
}

@CommandHandler
fun handle(command: PublishProductCommand){
  if (isProductApproved){
    throw IllegalArgumentException("This product has not been approved by qa.")
  }
  ... do something
}

... Some other commands
... Check the same state again and again to every command
 

Как вы можете видеть, я должен проверить, что этот isproduct одобрен для большинства команд. Можно ли в любом случае легко применить это состояние проверки ко всем функциям или командам, прежде чем начинать выполнять какую-то логику. Я ожидал бы чего-то подобного

 @Aggregate
@CheckState(value = isProductApproved)
class ProductAggregate {
  ... apply to every command
}
 

Или какие-либо лучшие способы.

Ответ №1:

В приложениях Axon Framework можно определить перехватчик обработчика для определенного компонента, содержащего обработчики (в вашем случае агрегат). Этого можно достичь, добавив метод, обрабатывающий сообщение, в сочетании с @MessageHandlerInterceptor аннотацией.

Вы можете найти более подробную информацию в официальном справочном руководстве Axon (docs): https://docs.axoniq.io/reference-guide/axon-framework/messaging-concepts/message-intercepting#messagehandlerinterceptor

На мой взгляд, это был бы наиболее прагматичный способ выполнить некоторую логику, общую для конкретного компонента, который в вашем случае является агрегатом (но на самом деле это может быть любой другой компонент обмена сообщениями: например, обработчики событий / запросов)

Ответ №2:

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

 private fun requireProductIsApproved() = require(isApprovedProduct) { 
   "This product has not been approved by qa." 
}

@CommandHandler
fun handle(command: PublishProductCommand){
  requireProductIsApproved()
  //... do something
}
 

Почему?

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