恐怕我已经知道答案了,但是我希望有人可以提供以前没有找到的替代解决方案。和往常一样,按照Effective Aggregate Design进行DDD比我想象的要困难得多,但这是我的情况。

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

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

    您如何防止这种情况?当前,我们正在寻找使授予该角色组AR中特定角色组的用户的身份,以便删除角色组并将其授予用户将导致乐观的并发冲突。但是不知何故,这似乎不是正确的解决方案。

    最佳答案

    这类似于可以解决唯一性约束的方式。

    假设角色组和用户都有一个具有SERIAL行为的预测。当角色组被存档时(即,它们将无法再使用),位于投影顶部的 react 性位可以通知已被授予该角色组的所有用户它们不再属于该角色组。当同时将此存档的角色组授予用户(或一组)时,可以利用转换的序列性质来告诉该用户他们不再属于该组。

    话虽如此,这只是家务。仅当角色组和用户被使用时,正确的 View 才是重要的。由于我假定角色组将携带一个IsArchived位,因此我可以安全地将它们过滤掉,而不必担心某些悬而未决的情况,我们仍然必须证明必须自动解决该问题。

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

    “取决于” TM

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

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

    10-10 07:30