恐怕我已经知道答案了,但我希望有人可以提供以前没有找到的替代解决方案。与往常一样,根据有效聚合设计进行 DDD比我想象的要困难,但这是我的场景。
- 我们有两个 AR,User 和 RoleGroup
- 一个用户可以被授予一个特定的角色组,从而获得该角色组中角色(一个集合值对象)提供的权限。角色组的身份作为另一个 VA 保存在用户 AR 中。
- 当从系统中删除 RoleGroup 时,我们会引发一个域事件,处理程序使用该事件来查找引用该 RoleGroup 的所有用户并删除该引用。相应的投影反规范化器将使用相同的事件来更新用户的有效角色。这是授予该用户的各个角色和所有授予 RoleGroup 的角色的组合。
- 这不一定是事务性的(因为它最终可以是一致的)。
- 我们通过 Jonathan Oliver 的 EventStore 3.0 以及 Lokad.CQRS 和 NCQRS 中的元素来使用 Event Sourcing。
因此,理论上,当一个请求(它是一个 ASP.NET MVC 应用程序)正在执行上述场景时,另一个请求可能会将相同的 RoleGroup 授予用户。如果在上述域事件处理程序扫描与该角色组相关的用户之后发生这种情况,则该请求将完成。此时,您有一个已删除的角色组(尽管不是物理删除)和一个仍持有该角色组身份的用户。
你如何防止这种情况发生?我们目前正在考虑将用户的身份授予该 RoleGroup AR 的特定 RoleGroup 一部分,以便删除 RoleGroup 并将其授予用户将导致乐观并发冲突。但不知何故,这感觉不是正确的解决方案。