使用其他聚合中的数据检查命令的有效性

迪斯科

我目前正在开发第一个更大的DDD应用程序。目前,它运行良好,但是自从早期以来,我们就遇到了一个问题,我不能停止思考:

在某些集合中,我们保留对整个应用程序非常重要的另一个聚合根的引用(基于它们的ID,因此没有硬引用-删除也基于事件/最终一致性)。现在,当我们创建一个新的实体“ Entity1”时,我们将发送一个新的CreateEntity1Command,其中包含所引用的聚集根的ID。

现在如何检查引用的ID是否有效?现在,我们通过读取其他聚合来检查它(不修改那里的任何内容)-但是这种方法在某种程度上感觉很脏。我只想“信任”命令,因为不能手动输入ID,而必须选择ID。问题在于,我们的应用程序是一个Web应用程序,信任您在那里获得的用户输入并不是真正安全的方法(即使它不是公众可访问的)。

我是否忽略了针对此问题的任何可能解决方案,还是应该忽略需要更好的解决方案的感觉?

Kanishk

直接聚合到聚合交互是DDD中的反模式。聚合A不应直接向聚合B发送命令或查询。聚合是严格的一致性边界。

我可以想到两种解决方案:假设您有2个聚合根(AR)-A和B。每个AR都有一堆命令处理程序,其中每个命令引发1个或多个事件。您在A中的命令处理程序取决于B中的某些数据。

  1. 您可以订阅B引发的事件,并维护B在A中的状态。您只能订阅指示有效性的事件。

  2. 您可以在A和B之间协调一个完全独立的服务(S)。与其直接向A发送请求,不如将请求发送给S,后者将负责B的查询(以检查引用ID的有效性),然后将请求转发给A。有时称为过程管理器(PM)。

例如,在您创建新的实体“ Entity1”的情况下,将此请求发送给负责验证请求中数据是否有效的PM,然后将您的请求路由到负责创建“ Entity1”的集合中。向此PM发送一个包含引用的聚集根ID的新CreateEntity1Command,该PM使用引用的AR的ID来确保其有效,如果有效,则只有它将请求转发。

有用的链接:http : //microservices.io/patterns/data/saga.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章