2012-03-24 84 views
0

我正在用WCF做一个项目。我必须处理两个字典:一个是用户列表,另一个是组列表。也就是说,我设法通过创建适当的消息来创建,删除和搜索用户和组。但我仍然无法将用户添加到群组中。 因此,在用户中引用一个组和一组用户组。 如果您需要更多详细信息,请让我知道。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

不是关于这个问题,而是:你的代码评论是C/C++风格。 .Net通常使用“///

....”。看看那个! :) – 2012-03-24 17:51:08

+1

而......问题是什么? – 2012-03-24 17:54:43

+0

这里没有问题。 – 2012-03-25 22:18:49

回答

1

通过添加从用户到该组要创建一个circular reference,这是一个代码味道用户参考和该组。最好的办法是只有一部分参考另一部分。

与关系数据库相同,您可以编写UserGroup之间的关系顺序。在这种情况下,它是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