WCF引用字典

时间:2012-03-24 17:44:46

标签: c# 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;

谢谢。

1 个答案:

答案 0 :(得分: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