onCommand
fun onCommand(command: CommandMessage<CreateOrder>, @Name(value = "createOrderSpec") specification: CreateOrderSpec, commandResultAccessor: CommandResultAccessor): Mono<OrderCreated>
此时的聚合处于空状态,也可以理解为该方法是一个聚合工厂,订阅首个聚合命令并发布首个领域事件.
me.ahoo.wow.modeling.annotation.OnCommand 注解是可选的,约定命令默认命令函数为名 onCommand
Kotlin 协程 Style
suspend fun onCommand(
command: CommandMessage<CreateOrder>,
@Name("createOrderSpec") specification: CreateOrderSpec,
commandResultAccessor: CommandResultAccessor
): OrderCreated {
val createOrder = command.body
require(createOrder.items.isNotEmpty()) {
"items can not be empty."
}
createOrder.items.asFlow().collect {
specification.require(it).awaitSingle()
}
val orderCreated = OrderCreated(
orderId = command.aggregateId.id,
items = createOrder.items.map {
OrderItem(
id = GlobalIdGenerator.generateAsString(),
productId = it.productId,
price = it.price,
quantity = it.quantity,
)
},
address = createOrder.address,
fromCart = createOrder.fromCart,
)
commandResultAccessor.setCommandResult(
OrderState::totalAmount.name,
orderCreated.items.sumOf { it.totalPrice }
)
return orderCreated
}Content copied to clipboard
Parameters
specification
该外部服务将会通过 IOC 容器自动注入进来
***** 重要:命令处理函数不直接修改聚合状态,而是通过执行完业务验证逻辑后返回领域事件来由聚合朔源事件修改聚合状态,并且发布到事件总线 *****.
命令处理函数职责:
验证命令参数是否符合业务规范
验证当前当前状态是否可以执行该命令
返回事件,用于对外发布聚合状态变更事件(可对外发布多个事件)
订单服务 订阅 支付服务 发布的集成事件 PaymentOrderPaid,适配成 订单服务 限界上下文 PayOrder 命令.
See also
PaymentOrderPaid