仍在试验DDD并有一些疑问,也许有人会帮助我。
让我们说我有2个型号:
public class Event
{
User Creator;
List<User> Members;
}
public class User {}
我的问题是我无法看到我想要实现的逻辑位置。我需要3个动作:
现在我刚创建了名为 Event.RemoveUser / AddUser 的域服务 EventUserService ,即。检查 CurrentUser (由 UserService 提供)是否为事件的创建者(有权删除其他用户)。 也许这种方法还可以,但我仍然认为我应该将这种逻辑推入聚合根,即。 :
如果前两个方法看起来没问题(至少对我而言),第三个方法将创建 Event.RemoveUser (以管理Event成员集合)方法,该方法可用于绕过驻留在中的逻辑User.RemoveUserFromEvent 。
所以,最后我有两个问题:
也许有人可以对我说一点点,每一个帮助都会很好。
答案 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/