我如何从轴突框架中的聚合成员访问聚合根状态

问题描述

假设我有CloudServer Aggregate,其中有cloudService作为其成员。如果用户想要升级他们的cloudService,我需要计算他们是否有足够的余额来进行升级,但是我不知道如何从AggregateMember访问AggregateRoot的余额状态。代码如下所示。

@Aggregate
class CloudServerAggregate() {
  @AggregateIdentifier
  lateinit var cloudServerId: String
  lateinit var balance: BigDecimal

  @AggregateMember(eventForwardingMode = ForwardMatchingInstances::class)
  var cloudService = mutablelistof<CloudService>()
}

class CloudService(
  @EntityId
  val serviceId: String
) {

  val isActivated: false
  
  @CommandHandler
  fun handle(command: UpgradeServiceCommand){
//    I need to check the current balance of this cloud server,but I also need to use the state inside this class
//    if(balance < command.price) {
//      throw IllegalArgumentException("Insufficient balance")
//    }
//    if(!isActivated){
//      throw IllegalArgumentException("Some errors")
//    }
  }
}

解决方法

没有直接方法可以从聚集成员访问聚集。

由于您要执行的操作取决于聚合根,因此最好将命令处理程序移至聚合本身。

检查余额并相应地升级服务。如果余额通过验证,您甚至可以从聚合根的命令处理程序直接在服务对象上调用“命令处理程序”功能。

,

应该有一种扩展 AnnotatedAggregate 的方法。 然后您应该能够使用 getAggregateRoot()(或使用 kotlin 的aggregateRoot),然后使用“as CloudServerAggregate”进行转换。