gpt4 book ai didi

domain-driven-design - 如何在 DDD 中为用户和组建模?

转载 作者:行者123 更新时间:2023-12-01 11:40:18 25 4
gpt4 key购买 nike

除了以下场景是否适合 DDD 的问题,我想讨论一下并征求建议:

Given we have users and groups. A user has a name, and a group has a name as well. Users may join of leave groups, and they may also change groups. The rules they have to obey are: A user may only be in maximally 2 groups, and a group may consist of maximally 10 users.



你如何建模?到目前为止,我可以想到三个选项,每个选项都有其各自的优点和缺点:
  • 用户和组是实体,两者也是聚合体。 Join , SwitchLeave是组聚合上的命令。虽然这对 Join 很有用和 Leave (因为它们只指一个组),它不适用于 Switch ,因为这同时指的是两个组,因此需要在单个事务中修改两个聚合,这并不好。
  • 用户和组是实体,两者也是聚合体。 Join , SwitchLeave是用户聚合上的命令。这对所有三个都非常有效,并且很容易检查用户是否同时属于两个以上的组,但是您如何检查每组最多 10 个用户的规则没有被违反?
  • 用户和组是实体,两者都是聚合体。但还有第三种蕴:关系。 Join , SwitchLeave现在是关系聚合上的命令。虽然这似乎是最好的方法(因为它为用户和组之间的关系提供了一个名称并使其明确),但我现在完全不知道如何对约束进行建模。

  • 有人可以给我一个提示吗?

    如果只有两个约束之一,那就太容易了:然后您可以将命令放入也有约束的聚合中。但是如果你对双方都有约束,我就输了。有什么帮助吗?

    最佳答案

    您可以将 group 的一个实例交给用户,让它检查包含聚合的不变量。然后让用户知道它加入了该组,并让该组知道用户已加入。

    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

    关于domain-driven-design - 如何在 DDD 中为用户和组建模?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21755154/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com