我正在使用Axon 4,无法理解以下内容。 如果我正在处理聚合中的命令,我可以读取它的状态,但是如果我需要知道另一个聚合的某些属性怎么办?
这里是一个示例,我想从队列中分配一个任务给人员,并具有“人员”聚合和“队列”聚合。
@Aggregate
class PersonAggregate {
UUID id; //fields are just example
UUID currentTaskId
@CommandHandler
public void handle(AssignFreeTaskCommand cmd) {
//Need to get info about tasks here, queue aggregate is known from projection, as new queue are rare added (but task I'd is not)... }
}
@Aggregate
class QueueAggregate {
UUID id; //fields are just example
List<UUID> tasks;
}
我已经读过有关Saga的文章,但是如果我们也可以了解Saga的聚合状态,那么我也不会理解。
谢谢。
答案 0 :(得分:0)
您可以像使用其他任何bean一样将其注入到聚合中...因此,如果您需要收集其他信息来决定是否以及如何处理命令,只需注入所需的仓库/服务并使用它们即可。
在您的情况下,这可能是另一个聚合的aggregateRepository。但是,最好使用读取模型/投影并对其进行查询以获取所需信息,而不是直接依赖于另一个聚合的内部状态。
答案 1 :(得分:0)
这强烈建议您需要查看汇总的根设计。本质上,聚合负责其自身的完整性。如果它依赖外部信息,则不能再这样做。稍微更巧妙一点,您还可能会在代码中增加意外的复杂性。
聚合看起来不像数据模型。这是开发人员首次学习和设计AG时最难的部分。我们通常习惯于根据表格和关系进行思考。
很抱歉,如果下一条建议听起来像我在教你吮吸鸡蛋,但我有一段时间没有意识到这一点。之所以称为“集合”,是因为它们可以将一个以上的类聚集在一起以执行其工作。关键是您只能通过聚合根来更改任何这些类的状态。
因此,简短的答案是:再来看一下聚合根设计。