cqrs - Axon:单个聚合的多命令
问题描述
对于精细的 API 命令处理,我有一个非常好的想法。
我们的 Web API 应该提供一个简单的update
端点,但您可以向它提供多个命令。像这样的东西:
POST /myAggregate/12345/update
[
{ command1Name: "command1Data" },
{ command2Name: "command2Data" },
{ command3Name: "command3Data" }
]
在 Axon 内部,这似乎很难处理。尤其是与@AggregateVersion
.
我的第一个想法是拥有一个新的UpdateWrapperCommand
. 内部有一个List commands
. 然后在聚合中,您使用反射来调用正确的@CommandHandler
方法:
class UpdateWrapperCommand {
List commands;
}
@Aggregate
class MyAggregate {
// id, version, constructor, etc. pp.
@CommandHandler
public void handle(SomeCommand cmd) { ... }
@CommandHandler
public void handle(UpdateWrapperCommand cmd) {
// iterate over cmd.commands
// iterate over this.getClass().getMethods()
// find correct method(s), and invoke it
}
}
但是当@CommandHandler
s 也使用@MetaData
和/或 Spring Bean 注入时,它变得非常困难。
我的第二个想法是简单commandGateway.send
地循环调用。但这会爆炸,因为@TargetAggragateVersion
必须为每个命令设置,并且您必须等待每个命令完成,然后才能发送下一个命令。这不好。
你对此有什么想法吗?
它应该加载一次聚合,然后运行所有命令。
甚至可能有一些类似事务的行为:应用所有结果事件,或者不应用。
解决方案
我认为您最好立即解决此问题,而无需等待您添加到 Axon Framework 问题跟踪器的问题,即添加一个External Command Handler。
外部命令处理程序只是一个带有@CommandHandler
注释功能的常规组件。该方法将处理您UpdateWrapperCommand
并知道为包含它的每个命令有效负载发出单独命令的工作。
然而,正如您所建议的那样,聚合的加载优化实际上与实施批处理命令解决方案有关。虽然这在框架中绝对是可行的,但这个功能还没有到位。我建议您继续跟踪您创建的问题以跟踪它的进展。
希望这可以帮助你本杰明!
推荐阅读
- email - 使用 factory.LazyAttribute 生成虚假电子邮件
- vega-lite - 如何根据 Vega-Lite API 中的值进行条件着色
- python - 如何使用 Pymatgen 模拟 SiO2?
- c# - 将属性排除在 Azure 表存储中
- jsf - 为什么 PrimeFaces dataTable 在调用列表时多次调用方法?
- python - 模型外的输入令牌
- python - 从包含不同产品的单一列表中转置价格列表
- algorithm - 用于排序的大型输入的运行时错误(快速排序)
- flutter - 忍者:构建停止:子命令失败 - 颤振项目中的错误
- html - CSS背景图像不会被加载并且代码不会被更新