有时候,我需要运行一个仅知道实体ID而不知道它所属的集合的命令。
例如:
我有Order
个属于的Invoice
聚合根。
然后,在为发票注册实际付款时,只有Invoice
的ID可用。
我可以保留一个单独的表/集合“发票”,其中每个文档/行仅具有一个Order
ID,并且只能在发布InvoiceCreated
事件时插入其中。
(或一个通用的Entities
表,其中每个项目都类似于{type: "invoice", ag: <ID>}
,可能会放在agType: "order"
中)
这有问题,但我不确定如何。
如果此“查找”是在发布事件之前严格创建的,或者是在发布事件时通过事务处理而创建的,则似乎没有人会在它存在之前要求它,从而得到了误报“发票不存在”错误。
但是,在发布事件时/之前/与应用时/之后相比,这似乎很不正常。
这里的标准解决方案是什么?
我想想到的一个问题是,由于发布时而不是应用时填充了该事件,因此事件的幼稚重播不会重新创建该表。但是,数据绝对存在于事件流中。除此之外,由于其愚蠢的简单性,对该表进行核对非常不可能。无论聚合状态架构如何更改,都可以保留它。因此,这并不是一个强烈的反对意见。
答案 0 :(得分:1)
如果仅知道实体ID,则意味着您的聚合边界可能是错误的。命令总是在聚合范围内执行,并且根据聚合模式的定义,所有实体ID都在聚合内部,因此永远不可能直接从聚合外部引用实体。
在这种特殊情况下,发票与订单有关。它们可能包含彼此的引用,但是发票是财务实体,订单是销售实体。这些实体类型通常不仅是不同的集合,而且甚至是单独的子域或有界上下文。
当然,我不知道您的上下文,但是我建议再次运行设计以查看您的域模型是否正确。
答案 1 :(得分:0)
使用带有订单ID和发票ID的单独表是一种有效的方法。这将产生另一个可以通过重播事件轻松创建的投影。 您可能已经有发票投影表。为什么不将订单ID放在这里?