Axonframework,我如何将相同的状态检查应用到每个函数



所以我目前正在开发应用程序使用Spring引导与Axonframework,所以在Axonframework有一个东西叫聚合。它可以存储一些状态等等。一切都很好,但是有一种情况,我必须在更新聚合之前检查每个传入命令的相同状态。像这样

@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

正如您所看到的,我必须对大多数命令检查这个isProductApproved。在开始执行一些逻辑之前,是否可以轻松地将此检查状态应用于每个函数或命令。我希望是这样的

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

或者有更好的方法。

在Axon Framework应用程序中,可以为特定组件定义一个处理程序拦截器包含处理程序(在本例中为聚合)。这可以通过添加处理消息的方法并结合@MessageHandlerInterceptor注释来实现。

您可以在官方Axon参考指南(文档)中找到更多详细信息:https://docs.axoniq.io/reference-guide/axon-framework/messaging-concepts/message-intercepting#messagehandlerinterceptor

在我看来,这将是最实用的方式来做一些逻辑,是一般的一个特定的组件,这是在您的情况下一个聚合(但它可以是任何其他消息组件实际上:事件/查询处理程序,例如)

您提到您必须将此检查添加到most不是所有的命令。如果确实有例外的话,我认为下面这个无聊的低技术含量的解决方案可能是最合适的,即使它可能不是你想要的:

private fun requireProductIsApproved() = require(isApprovedProduct) { 
"This product has not been approved by qa." 
}
@CommandHandler
fun handle(command: PublishProductCommand){
requireProductIsApproved()
//... do something
}

为什么?

  1. 这很简单
  2. 它是灵活的:只需在不需要检查的CommandHandlers中省略它。
  3. 它使您的域逻辑独立于轴突特定机制

最新更新