当前位置: 首页 > 知识库问答 >
问题:

DDD CQRS中聚合的读取模型

闻人伟
2023-03-14

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

例如,在订单验证(订单聚合)中,有一个业务规则,该规则仅在未标记客户时验证订单。标志信息通过同步域事件放入读取模型(特定于聚合)。

你怎么看?

共有2个答案

丁钟展
2023-03-14

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

如果在订单中已经有一个客户ID,只需用它和一个标记了的成员组成一个VO即可。

当然,这仍然容易出现跨聚合通信的所有问题,因为数据来自Customer<代码>订单必须与其客户的标记状态保持同步,这可能需要大量工作。

在任何情况下,您都应该首先与您的领域专家确定立即一致性是否是绝对要求(在这种情况下,您必须以某种方式在事务中包装客户订单),或者在强制执行该不变量时,您是否能够在标记的新鲜度方面承受小的延迟。如果是后者,您可以选择复制顺序中标记的聚合或@VoiceOfUnreason提供的第一个选项——主要区别可能是,如果数据在聚合中,如果您在多个场合需要它,您将在域级别免费获得它,而不是在应用程序级别复制多个用例/命令处理程序中的签入。

刘瑞
2023-03-14

在聚合中使用小型读取模型从其他聚合或有界上下文中获取数据是件好事吗?

这并不理想。由于聚合的性质,它们不善于执行涉及自身之外状态的一致性。

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

在对聚合运行placeOrder命令之前,您还可以选择检查标志。对标志的检查可以在命令处理程序中完成,也可以在客户机中完成——基本上,您需要在将命令传递给聚合之前“验证”命令是否应该成功。

这就是说,如果在处理命令时尝试参考读取模型是至关重要的,那么一种方法就是使用“域服务”;将服务提供者作为命令的一部分传递给聚合,并让接口抽象掉运行查询需要查看聚合外部的事实。

这为您提供了一些保持聚合可测试性所需的解耦。

 类似资料:
  • 我正在使用模块为每个创建多个lambda。 我得到这个错误在不同的资源时,试图组装一个策略JSON: 我做错了什么,我应该如何列出由lambda模块生成的角色ARNs? 顺便说一下,下面是模块的外观,以及迭代的本地: 编辑:以下是指向我正在使用的外部模块的链接:https://registry.terraform.io/modules/terraform-aws-modules/lambda/aw

  • Elasticsearch支持模糊搜索查询:https://www.elastic.co/guide/en/elasticsearch/guide/2.x/fuzzy-match-query.html 和按术语的桶聚合:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket

  • 我们在C类中有以下方法: A是另一个类。在A中,我们有一个声明为类A1类型的变量(我认为这使得A成为一个聚合类)。我已经将以下对象定义为模拟对象: 而且 如果模拟A1对象并在when/verify中使用它的语法是正确的,请您提供帮助? 另一个问题是,如果没有必要为a1创建mock,应该使用哪种语法?例如,下面的可以吗? 谢谢

  • 我必须在弹性搜索中使用聚合执行搜索。因为刻面将在不久的将来被删除,所以我不能使用刻面。 当然,我被鼓励使用聚合。 下面的代码给了我想要的输出: 聚合聚合=elasticsearch chTemplate.query(搜索查询,新的结果提取器(){@覆盖公共聚合提取(搜索响应响应){返回response.get聚合(); 但问题是,它成为了我的弹性搜索查询之外的第二个查询,这使得它变得非常慢。 我正

  • 我在读一篇关于OOP中的关系、关联、组合、聚合等的文章。有些事情令人困惑 因此,在PHP中,我们调用以下代码组合 在阅读了几篇关于作文的文章后 以下是组成示例: 因此,根据我的理解,聚合意味着A类的对象可以存在于B类之外,而组合意味着A类生命周期的对象取决于B类。 我正确理解了吗?

  • 有人能解释一下聚合在SAP UI5中的确切含义吗?我正在尝试制作一个有两个视图的应用程序,我想从一个视图导航到另一个视图,反之亦然。所以,应用程序控件有聚合,所以我不知道聚合是什么?