2012-03-24 8 views
0

Ich mache ein Projekt mit WCF. Und ich muss mich mit zwei Wörterbüchern befassen: eines ist eine Liste von Benutzern, das andere eine Liste von Gruppen. Das heißt, ich schaffe es, Benutzer und Gruppen zu erstellen, zu entfernen und zu durchsuchen, indem ich die entsprechenden Nachrichten erstelle. Aber ich habe immer noch keine Ahnung, wie man Benutzer zu Gruppen hinzufügt. Also eine Referenz in Benutzer, um Teil einer Gruppe und Gruppen zu sein, um eine Anzahl von Benutzern zu haben. Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen.WCF, der ein Wörterbuch referenziert

Benutzerwörterbuch:

private Dictionary<string, User> Users = new Dictionary<string, User>(); 

Benutzerdaten Vertrag:

[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; 

Gruppe Wörterbuch

private Dictionary<string, Group> groups = new Dictionary<string, Group>(); 

Gruppendaten Vertrag

[DataMember(Name = "number")] 
public string Number; 
/** 
* The name of the group 
*/ 
[DataMember(Name = "group name")] 
public string GName; 

Danke.

+0

Nicht zum Thema, aber: Sie Code-Kommentar sind in C/C++ - Stil. .Net geht normalerweise mit "///

....". Schau dir das an! :) –

+1

Und ... was ist die Frage? –

+0

Hier ist keine Frage. –

Antwort

1

Durch Hinzufügen einer Referenz vom Benutzer zur Gruppe und der Gruppe zum Benutzer erstellen Sie eine circular reference, die ein Code-Geruch ist. Der beste Weg zu gehen ist, dass nur ein Teil auf den anderen Bezug nimmt.

Wie bei Relation Databases würden Sie die Reihenfolge der Beziehung zwischen User und Group schreiben. In diesem Fall ist es 1: N (Eins-zu-Viele): Viele Benutzer gehören zu einer Gruppe oder eine Gruppe hat viele Benutzer. So wie bei Datenbanken, die „viele Teil“ bekommt einen Verweis auf die „Eins“ Teil:

[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; 
} 

Während die Gruppe würde wissen nichts über seine Nutzer:

[DataContract] 
class Group 
{ 
    /** 
    * The name of the group 
    */ 
    [DataMember(Name = "group name")] 
    public string GName; 
} 

jedoch diese bedeutet auch, dass Sie eine umgekehrte Navigation haben - Sie können nicht direkt von Gruppen zu Benutzern navigieren. Wenn dies erforderlich ist, können Sie die Beziehung zwischen Benutzern und Gruppen invertieren, indem Sie die Gruppenklasse eine Liste von Benutzern halten und die Benutzer nichts über Gruppen wissen.

Der letzte Punkt ist, damit WCF diese Struktur korrekt serialisieren kann, müssen Sie sie an eine einzelne Instanz des Datenvertrags anhängen, sonst wird WCF nicht wissen, dass die im Benutzer referenzierte Gruppe tatsächlich Teil Ihrer Liste ist von Gruppen, also:

[DataContract] 
class GroupsAndUsers 
{ 
    public List<User> Users { get; set; } 

    public List<Group> Groups { get; set; } 
} 

Schließlich verwenden Ihre Gruppen- und Benutzerdatenverträge öffentliche Felder. Dies ist keine gute Praxis in .NET: Konvertieren Sie dann zu properties or auto-properties.