2012-03-02 22 views
3

我有一個現有的WCF REST/JSON服務,它返回不同類型數據的列表。我想爲每個響應添加一個代表版本號的屬性。WCF - 通用類的DataMember的自定義名稱

說我有一個「汽車」類

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

目前/汽車/返回汽車的陣列,像下面

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

現在,我想的響應是

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

這是微不足道的,如果我只有一個類的汽車,但我的服務有數百個簡單的實體和我爲每個返回修訂屬性和實體列表。我想我可以做下面的事情,在那裏創建一個泛型類來包裝現有的項目。

[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客戶端上處理。

希望這有助於您!