问题描述
假设我有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”进行转换。