4 Stimmen

Verdrahtung von zurückgegebenen Objektinstanzen in einem WCF-Client

Ich habe einen WCF-Dienst, der mehrere verschiedene Sammlungen zurückgeben kann.

Objekte in jeder Sammlung können Verweise auf Objekte in anderen Sammlungen haben. Beispiel: Ich habe eine Sammlung von Aufträgen und eine Sammlung von Kunden. Die Kundenobjekte enthalten eine Sammlung von Auftragsreferenzen, und jede Bestellung enthält eine Kundenreferenz.

Ich habe mich gefragt, wie man so etwas im Allgemeinen auf der Client-Seite handhabt. Soweit ich sehen kann, sind meine Möglichkeiten:

1) Lassen Sie WCF einfach alle Mitgliedsobjekte vollständig serialisieren und machen Sie sich keine Gedanken über die Duplizierung. Ich weiß, dass ich [PreserveReferences] verwenden kann, um dies bis zu einem gewissen Grad abzumildern, aber es gibt immer noch eine Menge Duplizierung und unnötige Serialisierung im Gange. Wenn ich z. B. ein Kundenobjekt vom Dienst anfordere, werden alle Mitglieder jeder Bestellung, die der Kunde hat, serialisiert, auch wenn ich diese Objekte bereits auf der Client-Seite in meiner Auftragssammlung habe. Das bedeutet auch, dass ich darauf achten muss, die Dinge immer nach Id abzugleichen, anstatt nur Instanzen zu vergleichen.

2) Serialisieren Sie Id's anstelle von Instanzen. Dies scheint der vernünftigste Ansatz zu sein, bedeutet aber, dass ich einen Punkt haben muss, an dem ich diese Ids wieder in Instanzen auf der Client-Seite verwandle. Dies bringt ein ganzes Durcheinander, wo dies zu tun, und wie die erforderlichen Repositories zu injizieren, um die Verdrahtung zu tun.

3) Verwenden Sie einfach Id's überall im Client, anstatt Instanzen zu verdrahten. Das fühlt sich für mich einfach falsch an und entfernt sich von dem ganzen Sinn von OOP. Anstatt auf eine Sammlung auf dem Objekt zuzugreifen, muss ich eine Sammlung von Id's zugreifen und dann schauen sie über einige globale Repository.

Im Moment tendiere ich zu 2, aber ich mag das Durcheinander in der Serie nicht, das daraus entstehen wird.

Ich sollte anmerken, dass der Client wahrscheinlich viel zustandsbehafteter ist als die meisten WCF-Clients und dass er eine offene Verbindung zum Dienst mit Callbacks usw. aufrechterhält, um seine Sammlungen zu pflegen, da er Echtzeitdaten anzeigt.

Prost

1voto

Chen Pang Punkte 1330

Ich denke, eine andere Möglichkeit ist, die Datensammlung nicht standardmäßig abzurufen. In Ihrem Beispiel könnte ich mehrere WCF-Methoden definieren:

ListCustomers() -- Gibt Kundenobjekte zurück, füllt aber nicht die Orders Collection ListOrders() -- Gibt Auftragsobjekte zurück, die jeweils mit einem Kundenobjekt verknüpft sind, aber das Kundenobjekt hat keine Auftragsinformationen.

ListOrdersForCustomer(id customer) -- Gibt die Bestellungen für einen bestimmten Kunden zurück.

Dies hat natürlich seine eigenen Nachteile, könnte aber für Ihr Beispiel funktionieren.

0voto

GazTheDestroyer Punkte 20048

Nachdem ich nun 12 Monate Erfahrung gesammelt habe, dachte ich, ich würde diesen Artikel mit meiner Lösung aktualisieren.

Ich verwende jetzt separate DTO-Objekte für die Serialisierung über WCF. Einige dieser Objekte verwenden Ids, andere enthalten vollständige Objektgraphen. Das Schöne an der Verwendung von DTOs ist, dass ich verschiedene Formate desselben Geschäftsobjekts zurückgeben kann, je nach den Anforderungen des Aufrufers.

Auf der Kundenseite habe ich praktisch zwei Ebenen. DTOs können direkt vom Dienst aus verwendet werden (indem ich vollständige Objektgraphen anfordere, die nur das enthalten, was ich benötige), aber ich pflege auch eine Reihe von Repositories von Geschäftsobjekten auf der Client-Seite. Diese Repos aktualisieren sich selbst mit DTOs, die nur Ids enthalten, und die Verdrahtung der Referenzen erfolgt an dem Punkt, an dem das DTO in ein Geschäftsobjekt übersetzt wird. Wie ich in meinem OP sagte, ist mein Client viel zustandsorientierter als die meisten WCF-Clients, und die Repos hören auch auf Service-Callbacks mit aktualisierten Objekten.

Das Ergebnis ist, dass der Client-Code die Client-Repos so verwenden kann, als würden sie auf der Service-Seite laufen, und Objektreferenzen können ohne doppelte Informationen über die Leitung verdrahtet werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X