2

仍在尝试 DDD 并有一些疑问,也许有人会帮助我。

假设我有 2 个模型:

public class Event
{
    User Creator;
    List<User> Members;
}

public class User {}

我的问题是我看不到要实现的逻辑的位置。我需要 3 个动作:

  • 用户加入活动
  • 用户离开事件
  • 创作者从活动中移除用户(只有创作者可以移除用户)

现在我刚刚创建了调用Event.RemoveUser/AddUser的域服务EventUserService和 ie。检查CurrentUser(由UserService提供)是否是事件的创建者(有权删除其他用户)。也许这种方法是可以的,但我仍然觉得我应该把这个逻辑放到聚合根中,即。:

  • User.JoinEvent(Event) - 我可以基于某些逻辑将传递的事件添加到 User.Events 集合(双向)。
  • User.LeaveEvent(Event) - 类似于 JoinEvent。
  • User.RemoveUserFromEvent(User,Event) - 我可以在User中拥有CreatedEvents集合,对于该集合中的Event,我可以调用Event.RemoveUser(User) - 这样我将确保只有创建者才能踢某人。或者
  • Evet.RemoveUser(UserToRemove) - 但我将如何确保它被创建者调用?

如果前两种方法看起来不错(至少对我而言),第三种方法将创建Event.RemoveUser(用于管理 Event 成员集合)方法,该方法可用于绕过User.RemoveUserFromEvent中的逻辑。

所以,最后我有两个问题:

  1. 在这样的情况下,您的方法是什么,其中两个聚合根一起工作并且一个操作由驻留在它们两者中的逻辑确定?也许像User.CanJoinEvent(Event)这样的方法?
  2. 如何创建像User.RemoveUserFromEvent这样的“危险”点

也许有人可以为我稍微说明一下,每一个帮助都会很好。

4

1 回答 1

1
public class Event
{
    User Creator;
    List<User> Members;
}

不要那样做。您正在违反 Demeter 法则,并且该Event班级无法控制该列表中的更改Members或该列表中的用户。相反,您应该在Event用于处理成员的类中定义方法。

现在,如果你做那个改变,即有这样的东西:

public class Event
{
    User Creator { get private set; }
    bool IsMember(string name);
    void AddMember(User user);
}

你会突然有可靠的地方来生成事件。

但是我将如何确保它被创建者调用?

在 .NET 中,您可以使用它Thread.CurrentPrinicpal来获取有关已登录用户的信息。但是,它确实需要您实现自己的IPrincipal/ IIdentity

请记住:您应该始终确保模型在 DDD 中处于有效状态。这通常意味着所有设置者都应该是私有的:http: //blog.gauffin.org/2012/06/protect-your-data/

于 2012-09-11T05:46:17.020 回答