恐怕我已经知道答案了,但我希望有人能提供一个以前没有找到的替代解决方案。像往常一样,按照有效集料设计做DDD比我想象的要困难得多,但这是我的场景。
因此,理论上,当一个请求(它是一个ASP.NET MVC应用程序)正在执行上述场景时,另一个请求可能会将相同的RoleGroup授予用户。如果在上面提到的与该RoleGroup相关的用户的域事件处理程序扫描之后发生这种情况,则该请求将完成。此时,您有一个被删除的RoleGroup (尽管不是物理上的)和一个仍然持有该RoleGroup标识的用户。
你怎么防止这件事?我们目前正在考虑将授予特定RoleGroup的用户身份作为RoleGroup AR的一部分,以便删除RoleGroup并将其授予用户将导致乐观的并发冲突。但不知何故,这并不是正确的解决办法。
发布于 2012-11-29 14:01:49
这类似于如何解决唯一性约束。
假设有一个具有串行行为的角色组和用户的投影。当rolegroup被存档(即它们不能再被使用)时,位于投影顶部的反应性位可以通知所有已被授予的用户,他们不再是它的一部分。当同时将这个归档的角色组授予一个用户(或一组)时,可以利用投影的串行性质来告诉该用户他们不再是组的一部分。
所有这些都是,这只是管家。只有当角色组和用户被使用时,正确的视图才是重要的。因为我假设rolegroup会携带一个IsArchived位,所以我可以在那时安全地过滤掉它们,而不用担心一些悬空的边缘情况,我们仍然需要证明它必须以自动化的方式被解决。
顺便说一句,扫描事件日志也会显示这种情况,即是否有任何用户被授予在该时间点之前存档的角色组(或在该时间点附近)?管理员可以通过向用户聚合发出补偿命令来解决这个问题。
“这取决于”TM
编辑:我已经给出了这个问题的技术解决方案。我鼓励其他读者探索不同的建模方法&解决这类问题。有时,甚至大多数情况下,答案根本就不是技术性的。YMMV
发布于 2012-11-29 13:15:08
为什么要向用户聚合添加RoleGroup引用?在使用此信息的用户上是否存在任何不变量?
我认为这可以通过通过RoleGroup聚合将RoleGroup授予用户来建模,从而发出类似于RoleGroupGrantedToUser事件的信息。当删除RoleGroup时,它会发出一个RoleGroupRemoved事件。在此事件发生后,RoleGroup不再接受新用户。
发布于 2012-11-29 13:07:09
为了防止这一点,您可以使它是事务性的,即不可能通过某种锁定机制将已删除的RoleGroup授予用户。但这只会使事情复杂化,正如你所指出的,这是不必要的。
当您将一个RoleGroup分配给一个用户时,我想您应该有一个类似的投影去定向器来更新用户的有效角色。您可以在此检查是否存在已授予的RoleGroup,如果不存在,则从用户中删除引用。那么,用户的有效角色最终应该是一致的。
https://stackoverflow.com/questions/13626130
复制相似问题