Frage

Angenommen, dieses einfache Szenario: Mein Kunde hat eine bereits funktionierende .NET -Anwendung und er/sie möchte einige Funktionen über WCF aufdecken. Also gibt er mir eine Versammlung, die eine öffentliche Klasse versteht, die die Follow -Methode enthüllt.

OrderDetail GetOrderDetail (int orderId) // Suppose OrderDetail has {ProductId, Quantity, Amount)

Jetzt möchte ich, dass einige Mitglieder von OrderDetail (Betrag) nicht serialisiert werden. Entsprechend http://msdn.microsoft.com/en-us/library/aa738737.aspx, Der Weg, dies zu tun, besteht durch die Attribute [DataContract] und [DataMember]/[Ignoredatamember]. Dies ist jedoch keine Option für mich, da ich den Quellcode des Clients nicht ändern kann. Daher suche ich nach einer Möglichkeit, zu spezifizieren, welche Mitglieder ich außerhalb der Definition des Typs serialisieren möchte. Etwas, das so aussehen sollte:

    [OperationContract]
    [IgnoreMember(typeof(OrderDetail), "Amount" )]
    OrderDetail QueryOrder(int orderId){
          return OrderDetail.GetOrderDetail(orderId)  
    }

Gibt es einen Weg dazu? Danke, Bernabé

War es hilfreich?

Lösung

Senden Sie die Client -Objekte nicht über das Kabel, erstellen Sie ein DTO aus dem Client -Objekt, das nur die Informationen enthält, die Sie senden möchten, und senden Sie diese stattdessen.

Auf diese Weise können Sie genau steuern, welche Informationen gesendet werden, und entspricht den WCF -Absichten, Nachrichten zu übergeben und nicht Objekte

Also erstellen Sie eine OrderDetailDto class und bevölkulieren dies mit den Daten aus dem OrderDetail Rückgabe durch den Anruf an die Methode im Client -Code. Dekorieren Sie die OrderDetailDto mit dem DataContract und DataMember Attribute (Sie können die Klasse hier umbenennen, damit sie bei der Rückgabe von WCF mit dem Namen zurückgegeben wird OrderDetail)

Wiederholen Sie dies für alle Objekte im Client-Code, damit Sie an der Servicegrenze im Grunde genommen von DTO-> Client-Objekten und Client-Objekten-> dto konvertieren

BEARBEITEN

Es gibt zwar eine Option, die es ermöglicht, was Sie verlangt haben (ich bin mir eines nicht bekannt, aber hoffentlich kann jemand anderes), dass Sie sie für zwei Zwecke verwenden (das Client -Objekt und den Nachrichtenvertrag), der gegen das Prinzip der einzelnen Verantwortung steht, und wenn Sie sie auf der Client -Seite erhalten, sind sie nicht die gleichen Client -Seitenobjekte, sondern nur DTOs mit den gleichen Eigenschaften, können Sie nicht in der Lage sein, Verhalten im Client zu erhalten Seitenobjekte (zumindest nicht ohne Bibliotheken auf der Serverseite und der Client -Seite).

Durch die Bindung des Datenvertrags an die Objekte müssen Sie auch die Änderungen an Client -Objekten und Datenverträgen als eine Sache verwalten. Wenn sie getrennt sind, können Sie die Änderungen an clientseitigen Objekten verwalten, ohne die DTOs zu ändern, und Sie können die unterschiedliche DTOs unterscheiden.

Während es so aussieht, als ob es eine Menge Arbeit ist, die DTOs zu kreieren, denke ich am Ende, dass es sich lohnt.

Andere Tipps

Sie müssen eine Wrapper -Klasse schreiben, in der nur die gewünschten Eigenschaften aufgedeckt werden und einfach die Klasse aufrufen, die Ihr Client zur Verfügung stellt, um seine Werte zu erhalten.

Die einzige andere Option wäre, eine neue dynamische Klasse mit Reflexion auszugeben und diese zu serialisieren (siehe http://msdn.microsoft.com/en-us/library/system.reflection.emit.typebuilder.aspx), aber es ist wahrscheinlich nicht die Mühe wert, es sei denn, Sie müssen viele Wrapper -Klassen bauen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top