我正在用WCF做一个项目。我必须处理两个词典:一个是用户列表,另一个是组列表。 也就是说,我设法通过创建适当的消息来创建,删除和搜索用户和组。但是我仍然无法将用户添加到群组中。 因此,在用户中引用作为组的一部分并且组具有多个用户。 如果您需要更多详细信息,请与我们联系。
用户词典:
private Dictionary<string, User> Users = new Dictionary<string, User>();
用户数据合同:
[DataMember(Name = "ID")]
public string ID;
/**
* First name of the User
*/
[DataMember(Name = "firstname")]
public string FirstName;
/**
* Last name of the User
*/
[DataMember(Name = "lastname")]
public string LastName;
/**
* The group that the User on
*/
[DataMember(Name = "group")]
public string Group;
组字典
private Dictionary<string, Group> groups = new Dictionary<string, Group>();
集团数据合同
[DataMember(Name = "number")]
public string Number;
/**
* The name of the group
*/
[DataMember(Name = "group name")]
public string GName;
谢谢。
答案 0 :(得分:1)
通过向用户添加用户对组和组的引用,您将创建circular reference,这是代码气味。最好的方法是只有一个部分参考另一个。
与您对关系数据库的处理方式相同,您可以编写User
和Group
之间关系的顺序。在这种情况下,它是1:N(一对多):许多用户属于一个组,或者一个组有很多用户。因此,与数据库一样,“很多部分”会引用“一个”部分:
[DataContract]
class User
{
[DataMember(Name = "ID")]
public string ID;
/**
* First name of the User
*/
[DataMember(Name = "firstname")]
public string FirstName;
/**
* Last name of the User
*/
[DataMember(Name = "lastname")]
public string LastName;
/**
* The group that the User on
*/
[DataMember(Name = "group")]
public Group Group;
}
虽然该小组对其用户一无所知:
[DataContract]
class Group
{
/**
* The name of the group
*/
[DataMember(Name = "group name")]
public string GName;
}
但是,这也意味着您有倒置导航 - 您无法直接从群组导航到用户。如果这是必要的,您可以通过让Group类保存用户列表并且用户对组无所了解来反转用户和组之间的关系。
最后一点是,要使WCF正确序列化此结构,您必须将其粘贴到单个数据协定实例,否则WCF将不会知道用户中引用的组实际上是您的列表中的一部分小组,所以:
[DataContract]
class GroupsAndUsers
{
public List<User> Users { get; set; }
public List<Group> Groups { get; set; }
}
最后,您的组和用户数据合同使用公共字段。这不是.Net中的好习惯:转换为properties or auto-properties。