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。这种设计的唯一缺点是必须确保列表同步(对于多线程环境来说,这可能是一件痛苦的事情)。这种设计的唯一缺点是必须确保列表同步(对于多线程环境来说,这可能是一个难题)