如何从另一个聚合或传奇中获取聚合状态

时间:2019-11-14 19:20:15

标签: aggregate cqrs saga axon

我正在使用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的聚合状态,那么我也不会理解。

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以像使用其他任何bean一样将其注入到聚合中...因此,如果您需要收集其他信息来决定是否以及如何处理命令,只需注入所需的仓库/服务并使用它们即可。

在您的情况下,这可能是另一个聚合的aggregateRepository。但是,最好使用读取模型/投影并对其进行查询以获取所需信息,而不是直接依赖于另一个聚合的内部状态。

答案 1 :(得分:0)

这强烈建议您需要查看汇总的根设计。本质上,聚合负责其自身的完整性。如果它依赖外部信息,则不能再这样做。稍微更巧妙一点,您还可能会在代码中增加意外的复杂性。

聚合看起来不像数据模型。这是开发人员首次学习和设计AG时最难的部分。我们通常习惯于根据表格和关系进行思考。

很抱歉,如果下一条建议听起来像我在教你吮吸鸡蛋,但我有一段时间没有意识到这一点。之所以称为“集合”,是因为它们可以将一个以上的类聚集在一起以执行其工作。关键是您只能通过聚合根来更改任何这些类的状态。

因此,简短的答案是:再来看一下聚合根设计。