假设我们在域模型中有两个聚合根:组和用户。
现在,可以在组中添加或删除用户。使用存储库模式,到目前为止我只建模了以下两个接口:
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,它声明必须只从一个地方(存储库)检索和存储聚合根,这就是为什么我有点困惑。
答案 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;}
}