3 Stimmen

WCF - Benutzerdefinierter Name für ein DataMember einer generischen Klasse

Ich habe eine bestehende WCF REST / JSON-Dienst, der Listen von verschiedenen Arten von Daten zurückgibt. Ich möchte zu jeder Antwort ein einzelnes Attribut hinzufügen, das eine Revisionsnummer darstellt.

Angenommen, ich habe eine Klasse 'Auto'.

[DataContract]
public class Car {
    [DataMember]
    public String make;
    [DataMember]
    public String year;
}

Derzeit gibt /cars/ ein Array von Cars zurück, wie das folgende

{ [ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ] }

Ich möchte, dass die Antwort lautet

{ revision:"1234", cars:[ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ]}

Dies ist trivial, wenn ich nur eine einzige Klasse von Cars habe, aber mein Dienst hat Hunderte von einfachen Entitäten und ich möchte für jede das Revisionsattribut und die Liste der Entitäten zurückgeben. Ich dachte, ich könnte etwas wie das folgende tun, wo ich eine generische Klasse erstellen, um das vorhandene Element zu wickeln.

[DataContract]
public class VersionedItem<T> {
    String revision;
    T item;

    [DataMember]
    public String revision {
        get{}
        set{}
    }

    [DataMember]
    public T item {
        get{}
        set{}
    }
} 

Dies funktioniert fast perfekt, außer wenn ich Folgendes zurückgeben muss:

{ revision:"1234", cars:[ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ] }

Dies wird tatsächlich zurückgegeben

{ revision:"1234", item:[ {year: "1990", make: "bmw"}, {year: "2010", make: "ferrari"} ] }

Frage 1: Gibt es eine Möglichkeit, eine Instanz der generischen Klasse zu spezialisieren, um den richtigen Namen für das Elementattribut (in diesem Fall Autos) anzugeben? IE, (totaler Blödsinn, aber um den Punkt zu verdeutlichen)

public class VersionedCar : VersionedItem<Car>
{
    [DataMember(Name="cars")]
    public Car item{
        get{}
        set{}
    }
}

Frage 2: Wenn nicht, wie kann man am besten erreichen, dass alle Antworten umbrochen werden und ein neues Attribut in alle Antworten aufgenommen wird?

2voto

krisragh MSFT Punkte 1908

Sie können einen "Operationsformatierer" einstecken. Ein Beispiel für die Verwendung von Reflector ist die Einbindung von WebHttpBehavior und die Verwendung von DataContractJsonSerializerOperationFormatter.

Um dies zu tun, müssen Sie zunächst in Ihrem eigenen Dienst Endpunkt Verhalten (ähnlich wie WebHttpBehavior) einstecken. Wenn das Verhalten für eine Operation Formatter gefragt wird, geben Sie es Ihre eigenen benutzerdefinierten Formatter (ähnlich DataContractJsonSerializerOperationFormatter._ Alles, was diese benutzerdefinierte Formatter tut ist serialisieren eine Version Wrapper um die Daten, die es normalerweise serialisiert, vor der Delegierung an seine üblichen Serialisierungsmechanismus.

Sie bräuchten auch ein ähnliches Client-Verhalten und den gleichen Formatierer auf der Client-Seite, damit solche Nachrichten auf WCF-Clients verarbeitet werden können.

Ich hoffe, das hilft!

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