Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DDD:如何对添加和删除相关实体进行建模?_C#_Design Patterns_Domain Driven Design - Fatal编程技术网

C# DDD:如何对添加和删除相关实体进行建模?

C# DDD:如何对添加和删除相关实体进行建模?,c#,design-patterns,domain-driven-design,C#,Design Patterns,Domain Driven Design,假设我们在域模型中有两个聚合根:组和用户 现在,用户可以添加到组或从组中删除。使用repository模式,到目前为止,我只对以下两个接口进行了建模: interface IGroupRepository { Group FindById(int groupId); } interface IUserRepository { User FindById(int userId); IQueryable<User> GetGroupMembers(int grou

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

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

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);
}
interface-igroup存储库
{
组FindById(int-groupId);
}
接口IUSER存储库
{
用户FindById(int userId);
IQueryable GetGroupMembers(int-groupId);
void AddUserToGroup(用户,组);
void RemoveUserFromGroup(用户-用户,组-组);
}
不知怎么的,这个人感觉不对劲。我希望实现一个干净的域模型,而不仅仅是数据访问层。有什么更好的方法来模拟上述情况


编辑:这里的根本问题似乎是,DDD的指导方针是否允许将用户视为“子对象”,同时它也是聚合根?正如我所理解的DDD,它指出聚合根只能从一个地方(存储库)检索和存储,因此我有点困惑。

如果您尽可能使用NHibernate之类的ORM,您可以使用以下方法:

class Group
{
    List<User> members;

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

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

应该给您一些关于NHiBiNAT.U/P> < P>的指导。在这种情况下,我会考虑在用户上创建一组组,反之亦然。这样,您就不需要在存储库上使用专门的方法。大多数ORM框架都支持这种映射

public class User
{
    public virtual ICollection<Group> Groups {get;set;}
}
公共类用户
{
公共虚拟ICollection组{get;set;}
}

NHibernate信息现在可以在上找到-旧站点已经关闭了一段时间了,这种方法不是将用户视为非聚合根用户吗?顺便说一句,我不在乎持久性——只是寻找一般的设计模式。如果你只考虑这种情况,那么它可能不是一个聚合根。但是,我假设您将使用用户进行更多操作。拥有存储库的唯一原因是作为一种持久化的方式(主要是)。因此,想象一下,如果没有存储库,您将如何对其进行建模。核心问题似乎是,当用户实际上是聚合根时,它是否会破坏域模型的一致性,从而将用户视为“子对象”。想编辑一下这个问题仔细考虑之后,在一个组中有一个用户集合似乎是很自然的。它应该被看作是对聚合根实例的引用列表
public class User
{
    public virtual ICollection<Group> Groups {get;set;}
}