恐怕我已经知道答案了,但是我希望有人可以提供以前没有找到的替代解决方案。和往常一样,按照Effective Aggregate Design进行DDD比我想象的要困难得多,但这是我的情况。
因此,从理论上讲,当一个请求(这是一个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/