首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何处理跨聚合根的并发约束

如何处理跨聚合根的并发约束
EN

Stack Overflow用户
提问于 2012-11-29 12:44:01
回答 3查看 1.3K关注 0票数 6

恐怕我已经知道答案了,但我希望有人能提供一个以前没有找到的替代解决方案。像往常一样,按照有效集料设计做DDD比我想象的要困难得多,但这是我的场景。

  • 我们有两个ARs,用户和RoleGroup
  • 用户可以被授予特定的RoleGroup,从而获得角色(集合值对象)在该角色组中提供的权限。角色组的标识作为另一个VA保存在用户AR中。
  • 当从系统中删除RoleGroup时,我们将引发一个域事件,处理程序将使用该事件查找引用该RoleGroup的所有用户并删除该引用。对应的投影去定向器将使用相同的事件来更新用户的有效角色。这是授予该用户的单个角色和所有授予RoleGroups的角色的组合。
  • 这不一定是事务性的(它最终可以是一致的)。
  • 我们使用事件源使用Jonathan的EventStore 3.0以及来自Lokad.CQRS和NCQRS的元素。

因此,理论上,当一个请求(它是一个ASP.NET MVC应用程序)正在执行上述场景时,另一个请求可能会将相同的RoleGroup授予用户。如果在上面提到的与该RoleGroup相关的用户的域事件处理程序扫描之后发生这种情况,则该请求将完成。此时,您有一个被删除的RoleGroup (尽管不是物理上的)和一个仍然持有该RoleGroup标识的用户。

你怎么防止这件事?我们目前正在考虑将授予特定RoleGroup的用户身份作为RoleGroup AR的一部分,以便删除RoleGroup并将其授予用户将导致乐观的并发冲突。但不知何故,这并不是正确的解决办法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-29 14:01:49

这类似于如何解决唯一性约束。

假设有一个具有串行行为的角色组和用户的投影。当rolegroup被存档(即它们不能再被使用)时,位于投影顶部的反应性位可以通知所有已被授予的用户,他们不再是它的一部分。当同时将这个归档的角色组授予一个用户(或一组)时,可以利用投影的串行性质来告诉该用户他们不再是组的一部分。

所有这些都是,这只是管家。只有当角色组和用户被使用时,正确的视图才是重要的。因为我假设rolegroup会携带一个IsArchived位,所以我可以在那时安全地过滤掉它们,而不用担心一些悬空的边缘情况,我们仍然需要证明它必须以自动化的方式被解决。

顺便说一句,扫描事件日志也会显示这种情况,即是否有任何用户被授予在该时间点之前存档的角色组(或在该时间点附近)?管理员可以通过向用户聚合发出补偿命令来解决这个问题。

“这取决于”TM

编辑:我已经给出了这个问题的技术解决方案。我鼓励其他读者探索不同的建模方法&解决这类问题。有时,甚至大多数情况下,答案根本就不是技术性的。YMMV

票数 1
EN

Stack Overflow用户

发布于 2012-11-29 13:15:08

为什么要向用户聚合添加RoleGroup引用?在使用此信息的用户上是否存在任何不变量?

我认为这可以通过通过RoleGroup聚合将RoleGroup授予用户来建模,从而发出类似于RoleGroupGrantedToUser事件的信息。当删除RoleGroup时,它会发出一个RoleGroupRemoved事件。在此事件发生后,RoleGroup不再接受新用户。

票数 1
EN

Stack Overflow用户

发布于 2012-11-29 13:07:09

为了防止这一点,您可以使它是事务性的,即不可能通过某种锁定机制将已删除的RoleGroup授予用户。但这只会使事情复杂化,正如你所指出的,这是不必要的。

当您将一个RoleGroup分配给一个用户时,我想您应该有一个类似的投影去定向器来更新用户的有效角色。您可以在此检查是否存在已授予的RoleGroup,如果不存在,则从用户中删除引用。那么,用户的有效角色最终应该是一致的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13626130

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档