如何查找实体所属的聚合?

时间:2019-07-06 21:24:23

标签: event-sourcing

有时候,我需要运行一个仅知道实体ID而不知道它所属的集合的命令。

例如:

我有Order个属于的Invoice聚合根。 然后,在为发票注册实际付款时,只有Invoice的ID可用。

我可以保留一个单独的表/集合“发票”,其中每个文档/行仅具有一个Order ID,并且只能在发布InvoiceCreated事件时插入其中。

(或一个通用的Entities表,其中每个项目都类似于{type: "invoice", ag: <ID>},可能会放在agType: "order"中)

这有问题,但我不确定如何。

如果此“查找”是在发布事件之前严格创建的,或者是在发布事件时通过事务处理而创建的,则似乎没有人会在它存在之前要求它,从而得到了误报“发票不存在”错误。

但是,在发布事件时/之前/与应用时/之后相比,这似乎很不正常。

这里的标准解决方案是什么?

更新1

我想想到的一个问题是,由于发布时而不是应用时填充了该事件,因此事件的幼稚重播不会重新创建该表。但是,数据绝对存在于事件流中。除此之外,由于其愚蠢的简单性,对该表进行核对非常不可能。无论聚合状态架构如何更改,都可以保留它。因此,这并不是一个强烈的反对意见。

2 个答案:

答案 0 :(得分:1)

如果仅知道实体ID,则意味着您的聚合边界可能是错误的。命令总是在聚合范围内执行,并且根据聚合模式的定义,所有实体ID都在聚合内部,因此永远不可能直接从聚合外部引用实体。

在这种特殊情况下,发票与订单有关。它们可能包含彼此的引用,但是发票是财务实体,订单是销售实体。这些实体类型通常不仅是不同的集合,而且甚至是单独的子域或有界上下文。

当然,我不知道您的上下文,但是我建议再次运行设计以查看您的域模型是否正确。

答案 1 :(得分:0)

使用带有订单ID和发票ID的单独表是一种有效的方法。这将产生另一个可以通过重播事件轻松创建的投影。 您可能已经有发票投影表。为什么不将订单ID放在这里?