DDD:如何建模添加和删除相关实体?

时间:2009-04-29 08:08:04

标签: c# design-patterns domain-driven-design

假设我们在域模型中有两个聚合根:组和用户。

现在,可以在组中添加或删除用户。使用存储库模式,到目前为止我只建模了以下两个接口:

interface IGroupRepository
{
    Group FindById(int groupId);
}
interface IUserRepository
{
    User FindById(int userId);
    IQueryable<User> GetGroupMembers(int groupId);
    void AddUserToGroup(User user, Group group);
    void RemoveUserFromGroup(User user, Group group);
}

不知何故,感觉不对。我想实现一个干净的域模型,而不仅仅是数据访问层。什么是对上述模型进行建模的更好方法?

编辑:这里的根本问题似乎是DDD的指导方针将用户视为“子对象”,同时它也是一个聚合根目录吗?据我了解DDD,它声明必须只从一个地方(存储库)检索和存储聚合根,这就是为什么我有点困惑。

2 个答案:

答案 0 :(得分:3)

如果你使用像NHibernate这样的ORM来充分发挥其潜力,你可以使用这样的方法:

class Group
{
    List<User> members;

    void Join(User user)
    {
        members.Add(user);
    }

    void Leave(User user)
    {
        members.Remove(user);
    }
}

一个体面的ORM将跟踪成员列表的更改并将其保留到数据库中。

这样可以将您的界面简化为:

interface IGroupRepository
{
    Group FindById(int groupId);
}

interface IUserRepository
{
    User FindById(int userId);
}

This应该为您提供NHibernate的一些指导。

答案 1 :(得分:1)

在这种情况下,我会考虑在用户上创建一组Groups,反之亦然。这样,您就不需要在存储库上使用专门的方法。大多数ORM框架都支持这种映射

public class User
{
    public virtual ICollection<Group> Groups {get;set;}
}