gpt4 book ai didi

domain-driven-design - 如何处理跨聚合根的并发约束

转载 作者:行者123 更新时间:2023-12-04 15:46:16 52 4
gpt4 key购买 nike

恐怕我已经知道答案了,但我希望有人可以提供以前没有找到的替代解决方案。一如既往地按照 Effective Aggregate Design 做 DDD比我想象的要困难,但这是我的场景。

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

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

    你如何防止这种情况?我们目前正在考虑将用户的身份授予该 RoleGroup AR 的特定 RoleGroup 的一部分,以便删除 RoleGroup 并将其授予用户将导致乐观并发冲突。但不知何故,这感觉不像是正确的解决方案。

    最佳答案

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

    我想这可以通过通过 RoleGroup 聚合将 RoleGroup 授予用户来更简单地建模,发出类似 RoleGroupGrantedToUser 事件的内容。当一个 RoleGroup 被移除时,它会发出一个 RoleGroupRemoved 事件。在此事件之后,角色组不再接受新用户。

    关于domain-driven-design - 如何处理跨聚合根的并发约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13626130/

    52 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com