【问题标题】:How to get state of aggregate from another aggregate or saga如何从另一个聚合或传奇中获取聚合状态
【发布时间】:2019-11-14 19:20:15
【问题描述】:

我正在使用 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 中的聚合状态。

谢谢。

【问题讨论】:

    标签: aggregate cqrs saga axon


    【解决方案1】:

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

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

    【讨论】:

    • 对此答案的补充:如果您采用 CQRS,则永远不应访问查询的聚合状态。在问题中,您指定需要从另一个聚合中获取信息。不应围绕提供有关其状态的信息来设计命令模型。相反,请使用查询模型。
    • 但我在这里看到了问题。如果我错了,请纠正我,但查询端不是“黄金来源”,因此,查询服务的状态可能不一致,而不是域服务的状态(具有聚合的服务)。
    • 是的,当然,一切最终都是一致的。但即使你直接调用聚合,你也无法确定。它可能处于复杂工作单元的中间,并且只显示过时的信息。当您在聚合处理组件中添加查询投影时,您可能会最大程度地减少缺失。
    【解决方案2】:

    这强烈建议您需要查看您的聚合根设计。本质上,聚合对其自身的完整性负责。如果它依赖外部信息,它就不能再这样做了。稍微更微妙的是,您也可能会意外地为您的代码添加复杂性。

    聚合看起来不像数据模型。而这也是开发者第一次学习和设计 AG 时最难的部分。我们通常习惯于用表格和关系来思考。

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

    所以简短的回答是:再看看您的聚合根设计。

    【讨论】:

    • 你能介绍一下我的情况吗?我的设计有什么问题?
    猜你喜欢
    • 2013-07-10
    • 2020-05-21
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多