Domain driven design 事件来源-如何聚合
我试图了解如何在事件采购模型/DDD中实现这一点 假设有一个分布式应用程序,其中用户提交了一个申请,比如工作/贷款。因此,应用程序引发一个Domain driven design 事件来源-如何聚合,domain-driven-design,event-sourcing,Domain Driven Design,Event Sourcing,我试图了解如何在事件采购模型/DDD中实现这一点 假设有一个分布式应用程序,其中用户提交了一个申请,比如工作/贷款。因此,应用程序引发一个userapplicated事件 像信贷服务,犯罪记录服务这样的小额服务很少。。他们使用这个userapplicated事件进行一些验证,用CriminalCheckPassed,CreditCheckPassed响应。。。等等。假设要进行5次检查。将来,我们可能还会添加更多这样的检查 应用程序使用这些事件并做出一些决定。也就是说,只有当它们都成功验证时,应用
userapplicated
事件
像信贷服务
,犯罪记录服务
这样的小额服务很少。。他们使用这个userapplicated
事件进行一些验证,用CriminalCheckPassed
,CreditCheckPassed
响应。。。等等。假设要进行5次检查。将来,我们可能还会添加更多这样的检查
应用程序使用这些事件并做出一些决定。也就是说,只有当它们都成功验证时,应用程序才能通过将状态更改为UserApproved
来批准用户应用程序。任何验证都失败,这将是用户拒绝的
。差不多吧
听起来很简单。但我正在绞尽脑汁如何正确地实施
这是我的活动商店
我有一个物化的观点
如果我们在收到事件时必须更新物化视图/聚合,则应用程序需要5个不同的事件来做出决定。在此之前,它将被挂起。即使当我收到第5个事件时,物化视图也不知道它以前收到过多少个事件。我将查询整个事件存储
另一种方法是在物化视图中添加这些列。这样我们就知道我们是否收到了所有这些事件。它会起作用的。但是看起来超级丑陋
我的问题是-在这种情况下如何正确使用聚合?如果我理解正确,验证是域逻辑的一部分(必须确保它通过)。这里有一些外部服务,如信贷服务和犯罪记录服务 首先,我将用户建模为一个实体和自身的聚合根。然后,我将把求职申请建模为另一个实体和自身的另一个聚合根。现在有两个聚合,其关系是:用户可以有许多求职申请 现在,在创建作业应用程序实例之前,需要验证一些内容。此验证需要来自其他服务的一些知识。这可以通过创建一个域服务来解决,比如说JobApplicationCreationService,它的唯一职责是创建Job Application的新实例。然后,您需要在这里注入这些外部服务。在服务内部,使用注入的服务进行验证,然后如果所有验证都通过,则返回一个新的作业应用程序实例。此聚合实例将满足您的验证规则/域逻辑 此处的事件不适用于验证,而是用于使用最终一致性在聚合之间同步状态。发布和处理事件时,您需要确保生成事件的聚合已处于一致状态(在本例中为作业应用程序聚合)
以下是我个人的经验法则:尝试从静态工厂方法创建一个聚合,以包含创建逻辑。如果创建需要聚合本身边界之外的内容,请将其重构为域服务。好吧,如果
CriminalCheckPassed
是域事件,那么它们需要以某种方式改变域状态,因此您需要将其存储在域中(加载域实体时将恢复),说一个私人只读列表required checks
,在收到任何责任事件时检查这些,然后做出决定
如果它不是域事件,并且没有使用聚合根持久化,那么就有一个流程管理器(也称为Saga)(即
UserApprovalProcessmaanger
)收集这些外部事件并对其进行处理/持久化,一旦收集完所有事件,就会触发一个由域模型/聚合根处理的UserApproved
/userdefered
事件非常感谢您的回答。不幸的是,他没有回答我的问题。我还更新了我的问题,以便更清楚。谢谢。我的问题更多的是和传奇有关的。当您说“在事件存储区rt之外”时因为我最初的问题就是围绕着这个。嗯,是的。这种方法不会保存XxxCheckPassed
将不再保存在用户
聚合上。从您的问题来看,似乎没有任何XxxCheckPassed
事件正在更改用户的状态,否则您将能够访问而无需扫描事件。至于sagas/流程管理器,流程管理器是任何长时间运行的流程,这正是您的外部检查可能是什么。它们可能在几秒钟、几小时甚至几天或几周内完成,而这一过程只能在那时继续