Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/322.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

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# 一个类包含另一个类的列表,而另一个类包含另一个类的列表,这样的结构是不是很糟糕_C#_Design Patterns - Fatal编程技术网

C# 一个类包含另一个类的列表,而另一个类包含另一个类的列表,这样的结构是不是很糟糕

C# 一个类包含另一个类的列表,而另一个类包含另一个类的列表,这样的结构是不是很糟糕,c#,design-patterns,C#,Design Patterns,我在设计用户角色管理系统。在这个系统中,一个用户可以有多个角色,一个角色可以有多个用户。用户和角色之间是一对多的关系。我正在考虑一个建立这种关系的设计方案: Class User { List<Role> } Class Role { List<User> } 类用户 { 列表 } 阶级角色 { 列表 } 我的问题是,这是一个糟糕的设计。如果是的话,应该推荐什么方法来建立关系 关于是的,我会考虑这个糟糕的设计,因为现在你有两个列表要维护,假设这甚至是用交叉引用

我在设计用户角色管理系统。在这个系统中,一个用户可以有多个角色,一个角色可以有多个用户。用户和角色之间是一对多的关系。我正在考虑一个建立这种关系的设计方案:

Class User
{

  List<Role>
}

Class Role
{
List<User>
}
类用户
{
列表
}
阶级角色
{
列表
}
我的问题是,这是一个糟糕的设计。如果是的话,应该推荐什么方法来建立关系


关于

是的,我会考虑这个糟糕的设计,因为现在你有两个列表要维护,假设这甚至是用交叉引用编译的。

您最好创建一个连接对象,其他对象保存一个列表(一个同时具有用户和角色的类)

或者选择最有意义的一个,然后在需要查找具有特定角色的所有用户时对其应用一些查询。即

 myListOfUsers.Where(user => user.Roles.Contains(something));

是的,我会考虑这个糟糕的设计,因为现在你有两个列表要维护,假设这甚至是用交叉引用编译的。

您最好创建一个连接对象,其他对象保存一个列表(一个同时具有用户和角色的类)

或者选择最有意义的一个,然后在需要查找具有特定角色的所有用户时对其应用一些查询。即

 myListOfUsers.Where(user => user.Roles.Contains(something));

在子对象和父对象的上下文中这样做并不坏或不常见

Class User
{    
  List<Role> Children;
}

Class Role
{
  List<User> Parents;
}
类用户
{    
列出儿童名单;
}
阶级角色
{
列出家长名单;
}
这样你就知道父母和孩子之间的联系

例如.NET Framework中的XMLNode类


它具有ChildNodes和ParentNode属性。

在子对象和父对象的上下文中这样做并不是很糟糕或不常见

Class User
{    
  List<Role> Children;
}

Class Role
{
  List<User> Parents;
}
类用户
{    
列出儿童名单;
}
阶级角色
{
列出家长名单;
}
这样你就知道父母和孩子之间的联系

例如.NET Framework中的XMLNode类


它有ChildNodes和ParentNode属性。

我不理解以前对糟糕设计的任何指责。这是映射多对多关系的典型设计。特别是,如果您使用实体框架,您会一直得到这样的关系。 你甚至可以有一个自我介绍,为什么不呢

class Person
{
    List<Person> Friends;
}
班级人员
{
列出朋友;
}

我不理解以前对糟糕设计的任何指责。这是映射多对多关系的典型设计。特别是,如果您使用实体框架,您会一直得到这样的关系。 你甚至可以有一个自我介绍,为什么不呢

class Person
{
    List<Person> Friends;
}
班级人员
{
列出朋友;
}

只有在类位于单独的程序集中时,交叉引用才会导致编译错误。@C.Evenhuis-谢谢,我补充了这一点,以防出现这种情况case@Sayse-您能否提供一个在此场景中无法编译代码的示例?如果我没有记错的话,编译器甚至还没来得及编译代码,循环引用问题就会出现。@VijayGill-创建一个dll,其中包含一个带有用户列表的
Role
类,然后在包含该用户的程序中再次尝试引用该Role类class@Sayse-这也应该起作用,因为“用户”类将位于不同的名称空间中。如果由于糟糕的设计,名称空间是相同的,那么编译器将尝试在同一项目中使用该类,如果两个类的构造函数/方法签名不同,则可能导致编译器错误。但这完全是另一种糟糕的设计。OP所做的设计仍然不错,IMHO。交叉引用只会在类位于单独的程序集中时导致编译错误。@C.Evenhuis-谢谢,我补充了这一点,以防万一case@Sayse-您能否提供一个在此场景中无法编译代码的示例?如果我没有记错的话,编译器甚至还没来得及编译代码,循环引用问题就会出现。@VijayGill-创建一个dll,其中包含一个带有用户列表的
Role
类,然后在包含该用户的程序中再次尝试引用该Role类class@Sayse-这也应该起作用,因为“用户”类将位于不同的名称空间中。如果由于糟糕的设计,名称空间是相同的,那么编译器将尝试在同一项目中使用该类,如果两个类的构造函数/方法签名不同,则可能导致编译器错误。但这完全是另一种糟糕的设计。OP所做的设计还不错,IMHO。这种设计的唯一缺点是必须确保列表同步(对于多线程环境来说,这可能是一件痛苦的事情)。这种设计的唯一缺点是必须确保列表同步(对于多线程环境来说,这可能是一个难题)