Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Domain driven design 事件来源-如何聚合_Domain Driven Design_Event Sourcing - Fatal编程技术网

Domain driven design 事件来源-如何聚合

Domain driven design 事件来源-如何聚合,domain-driven-design,event-sourcing,Domain Driven Design,Event Sourcing,我试图了解如何在事件采购模型/DDD中实现这一点 假设有一个分布式应用程序,其中用户提交了一个申请,比如工作/贷款。因此,应用程序引发一个userapplicated事件 像信贷服务,犯罪记录服务这样的小额服务很少。。他们使用这个userapplicated事件进行一些验证,用CriminalCheckPassed,CreditCheckPassed响应。。。等等。假设要进行5次检查。将来,我们可能还会添加更多这样的检查 应用程序使用这些事件并做出一些决定。也就是说,只有当它们都成功验证时,应用

我试图了解如何在事件采购模型/DDD中实现这一点

假设有一个分布式应用程序,其中用户提交了一个申请,比如工作/贷款。因此,应用程序引发一个
userapplicated
事件

信贷服务
犯罪记录服务
这样的小额服务很少。。他们使用这个
userapplicated
事件进行一些验证,用
CriminalCheckPassed
CreditCheckPassed
响应。。。等等。假设要进行5次检查。将来,我们可能还会添加更多这样的检查

应用程序使用这些事件并做出一些决定。也就是说,只有当它们都成功验证时,应用程序才能通过将状态更改为
UserApproved
来批准用户应用程序。任何验证都失败,这将是
用户拒绝的
。差不多吧

听起来很简单。但我正在绞尽脑汁如何正确地实施

这是我的活动商店

我有一个物化的观点

如果我们在收到事件时必须更新物化视图/聚合,则应用程序需要5个不同的事件来做出决定。在此之前,它将被挂起。即使当我收到第5个事件时,物化视图也不知道它以前收到过多少个事件。我将查询整个事件存储

另一种方法是在物化视图中添加这些列。这样我们就知道我们是否收到了所有这些事件。它会起作用的。但是看起来超级丑陋


我的问题是-在这种情况下如何正确使用聚合?

如果我理解正确,验证是域逻辑的一部分(必须确保它通过)。这里有一些外部服务,如信贷服务和犯罪记录服务

首先,我将用户建模为一个实体和自身的聚合根。然后,我将把求职申请建模为另一个实体和自身的另一个聚合根。现在有两个聚合,其关系是:用户可以有许多求职申请

现在,在创建作业应用程序实例之前,需要验证一些内容。此验证需要来自其他服务的一些知识。这可以通过创建一个域服务来解决,比如说JobApplicationCreationService,它的唯一职责是创建Job Application的新实例。然后,您需要在这里注入这些外部服务。在服务内部,使用注入的服务进行验证,然后如果所有验证都通过,则返回一个新的作业应用程序实例。此聚合实例将满足您的验证规则/域逻辑

此处的事件不适用于验证,而是用于使用最终一致性在聚合之间同步状态。发布和处理事件时,您需要确保生成事件的聚合已处于一致状态(在本例中为作业应用程序聚合)


以下是我个人的经验法则:尝试从静态工厂方法创建一个聚合,以包含创建逻辑。如果创建需要聚合本身边界之外的内容,请将其重构为域服务。

好吧,如果
CriminalCheckPassed
是域事件,那么它们需要以某种方式改变域状态,因此您需要将其存储在域中(加载域实体时将恢复),说一个
私人只读列表required checks
,在收到任何责任事件时检查这些,然后做出决定


如果它不是域事件,并且没有使用聚合根持久化,那么就有一个流程管理器(也称为Saga)(即
UserApprovalProcessmaanger
)收集这些外部事件并对其进行处理/持久化,一旦收集完所有事件,就会触发一个由域模型/聚合根处理的
UserApproved
/
userdefered
事件

非常感谢您的回答。不幸的是,他没有回答我的问题。我还更新了我的问题,以便更清楚。谢谢。我的问题更多的是和传奇有关的。当您说“在事件存储区rt之外”时因为我最初的问题就是围绕着这个。嗯,是的。这种方法不会保存
XxxCheckPassed
将不再保存在
用户
聚合上。从您的问题来看,似乎没有任何
XxxCheckPassed
事件正在更改
用户的状态,否则您将能够访问而无需扫描事件。至于sagas/流程管理器,流程管理器是任何长时间运行的流程,这正是您的外部检查可能是什么。它们可能在几秒钟、几小时甚至几天或几周内完成,而这一过程只能在那时继续