2012-03-02 6 views
3

さまざまなタイプのデータのリストを返す既存のWCF REST/JSONサービスがあります。私はリビジョン番号を表す単一の属性を各応答に追加したいと思います。 WCF - 汎用クラスのDataMemberのカスタム名

は、応答があるために私がしたい、私は今、次の

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

のように、

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

が現在/車が/車の配列を返す「カー」クラスを持っていると言います

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

私は車の単一のクラスを持っている場合、これは簡単ですが、私のサービスは、単純なエンティティとIの数百を持っていますリビジョン属性とエンティティのリストを返すのが好きです。私は既存のアイテムをラップするジェネリッククラスを作成する場合、次のようなことができると思いました。

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

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

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

これは、ほとんど私が返され、次の必要がある場合を除き、素晴らしい作品:

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

これは実際に

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

質問1を返されます。インスタンスを専門とするどのような方法がありますアイテム属性(この場合は車)の正しい名前を指定する汎用クラスのIE、(総ナンセンスが、全体のポイントを得るのを助けるために)

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

質問2:そうでない場合は、すべての応答をラップし、すべての応答で新しい属性を含む達成するいただきました!最良の方法は?

答えて

2

「操作フォーマッタ」を接続することができます。たとえば、Reflectorを使用して、WebHttpBehaviorがプラグインされ、DataContractJsonSerializerOperationFormatterを使用する方法を見てください。

これを行うには、WebHttpBehaviorに似た、独自のサービスエンドポイントの動作をプラグインする必要があります。動作が操作用フォーマッタを要求されると、独自のカスタムフォーマッタが返されます(DataContractJsonSerializerOperationFormatter._と同様)。カスタムフォーマッタは、通常のシリアル化メカニズムに委譲する前に、通常のシリアル化を行うデータのバージョンラッパーをシリアル化します。

同様のクライアントビヘイビアと同じフォーマッタがクライアント側に必要ですメッセージはWCFクライアントで処理できます。

希望します。

関連する問題