繁体   English   中英

读取DDD CQRS ES中的汇总模型

[英]Read model for aggregate in DDD CQRS ES

在CQRS + ES和DDD中,具有小型读取模型以从其他聚合或有界上下文中获取数据是一件好事吗?

例如,在订单验证(“订单总计”中)中,有一个业务规则仅在未标记客户的情况下才验证订单。 通过同步域事件将标志信息放入读取模型(特定于聚合)中。

你怎么看待这件事 ?

汇总读取模型以从其他汇总或有界上下文中获取数据是一件好事吗?

这不理想。 由于聚合的性质,聚合不善于强制执行涉及自身外部状态的一致性。

这通常意味着,当两个聚合产生不可接受的状态时,企业将需要某种方式做出响应。

您还可以选择在聚合上运行placeOrder命令之前检查标志。 该标志的检查可以在命令处理程序中或在客户端中进行-基本上,您已经在“验证”命令在传递给聚合之前应该成功。

就是说,如果在处理命令时尝试查阅读取模型非常关键,那么一种方法是使用“域服务”; 您将服务提供者作为命令的一部分传递给集合,然后让接口抽象出以下事实:运行查询需要查看集合之外。

这使您可以保持聚合可测试性所需的一些解耦。

这是可行的,但不是以读取模型的形式,而是聚合中的值对象(因为我们在写端)。

如果您已经有一个OrderCustomerId ,则只需与其组成一个VO和一个Flagged成员。

当然,由于数据源自Customer ,因此这仍然易于发生跨集合通信的所有问题。 Order必须与其客户的标记状态保持同步,这可能需要大量工作。

无论如何,您可能应该首先与您的域专家确定是否要立即保持一致性(在这种情况下,您必须以某种方式将客户+订单包装在交易中),或者在强制执行时可以在标记新鲜度方面稍作延迟不变的 如果是后者,则可以在复制“ Order聚合中的Order标记”或@VoiceOfUnreason给出的第一个选项之间进行选择-主要区别在于,如果数据在聚合中,则在域级别您可以免费获得它多次需要它,而不是在应用程序级别在多个用例/命令处理程序中重复检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM