DDD:将逻辑放在聚合根目录中的位置

时间:2012-09-11 00:36:00

标签: oop domain-driven-design

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

让我们说我有2个型号:

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

public class User {}

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

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

现在我刚创建了名为 Event.RemoveUser / AddUser 的域服务 EventUserService ,即。检查 CurrentUser (由 UserService 提供)是否为事件的创建者(有权删除其他用户)。 也许这种方法还可以,但我仍然认为我应该将这种逻辑推入聚合根,即。 :

  • User.JoinEvent(Event) - 我可以根据某些逻辑将传递的事件添加到User.Events集合(bidirectionall)。
  • User.LeaveEvent(Event) - 类似于JoinEvent。
  • User.RemoveUserFromEvent(User,Event) - 我可以在用户中拥有 CreatedEvents 集合,从该集合中可以使用 Event 我可以调用< em> Event.RemoveUser(User) - 这样我就可以确保只有创作者可以踢人。 或
  • Evet.RemoveUser(UserToRemove) - 但是我如何确保它被创建者调用?

如果前两个方法看起来没问题(至少对我而言),第三个方法将创建 Event.RemoveUser (以管理Event成员集合)方法,该方法可用于绕过驻留在中的逻辑User.RemoveUserFromEvent

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

  1. 在这种情况下你的方法是什么,其中两个聚合根一起工作,一个操作由驻留在它们中的逻辑决定?也许像 User.CanJoinEvent(Event)这样的某种方法?
  2. 如何创建“危险”点,如 User.RemoveUserFromEvent
  3. 也许有人可以对我说一点点,每一个帮助都会很好。

1 个答案:

答案 0 :(得分: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/