除了以下场景是否适合DDD的问题之外,我想讨论一下并征求意见:
考虑到我们有用户和组。用户有一个名称,一个组也有一个名称。用户可以加入休假组,也可以更改组。他们必须遵守的规则是:一个用户可能只有最多两个组,而一个组可能由最多10个用户组成。
你是怎么模拟这个的?到目前为止,我可以想到三种方案,每种方案各有优缺点:
Join
、Switch
和Leave
是组聚合上的命令。虽然这对于Join
和Leave
非常有用(因为它们只引用单个组),但是它不适用于Switch
,因为它同时引用两个组,因此需要在单个事务中修改两个聚合,这不是很好。Join
、Switch
和Leave
是用户聚合上的命令。这对这三个组都很有用,而且很容易检查用户是否同时在两个以上的组中,但是如何检查每个组中最多10个用户的规则没有被违反呢?Join
、Switch
和Leave
现在是关系聚合的命令。虽然这似乎是最好的方法(因为它给用户和组之间的关系一个名称并使其显式化),但我现在完全不知道如何建模约束。有人能给我个提示吗?
如果只有这两个约束中的一个,那就太简单了:那么您可以将命令放到具有约束的聚合中。但如果你对双方都有限制,我就迷路了。有什么帮助吗?
发布于 2014-02-13 05:17:01
您可以将组的一个实例交给用户,让它检查聚合-包含不变量。然后让用户知道它加入了这个组,让这个组知道一个用户已经加入了。
class Application
handle(UserWantsToJoinGroup command)
user = users.withId(command.userId)
group = groups.withId(command.groupId)
user.join(group)
class User
join(Group g)
if g.isFull throw
if this.isMemberOf(g) throw
if this.numberOfGroupsImIn >= 2 throw
publish new JoinedGroup(this.userId, g.groupId)
handle(JoinedGroup evt)
// modify state
class Group
handle(JoinedGroup evt)
// modifiy state
https://stackoverflow.com/questions/21755154
复制