2010-07-01 51 views
0

我正在實現lo-REST API並正在返回XML或JSON。在.NET WCF中構建它。用於REST的WCF wrap可變複雜類型

我都喜歡Flickr和最後FM的API,其包裹它們的變量複雜類型ALA簡單響應的設計:

<lfm status="ok"> 
    <user> 
    <name>RJ</name> 
    <realname>Richard Jones </realname> 
    <country>UK</country> 
    <age>27</age> 
    </user> 
</lfm> 

<lfm status="ok"> 
    <track> 
    <name>Best track ever</name> 
    <album>Thriller</album> 
    </user> 
</lfm> 

<lfm status="fail"> 
    ... error details 
</lfm> 

複雜類型的序列化非常簡單(使用DataContract,DataMember等)。但是,由於可能包含在內部的可變複雜類型,將它封裝在某種自定義響應中會讓我失望。給予響應由所述複合型滿不序列類型對象的成員:

[DataContract] 
public class Response 
{ 
    public enum ResponseStatus 
    { 
     ok, 
     fail 
    } 

    [DataMember] 
    public ResponseStatus Status { get; set; } 

    [DataMember] 
    public object Data { get; set; } 

} 

任何想法或幫助感激。

非常感謝, 亞歷

編輯: 蒂姆·羅伯茨提供了一個有趣的解決方案,雖然它不能很好地連載。一個選項是將所有可能的複雜類型指定爲指定了[DataMember(EmitDefaultValue = false)]的屬性,因此空值不會連續化。不知道這是最好的解決方案。

回答

1

你可以內Response定義一個類層次結構爲您Data類型:

例如,

[DataContract] 
public abstract class Data 
{ } 

[DataContract] 
public class FooData : Data 
{ } 

[DataContract] 
public class BarData : Data 
{ } 

則表明在Response類已知類型:

[DataContract] 
[KnownType(typeof(FooData))] 
[KnownType(typeof(BarData))] 
public class Response 
{ 
    public enum ResponseStatus 
    { 
     ok, 
     fail 
    } 

    [DataMember] 
    public ResponseStatus Status { get; set; } 

    [DataMember] 
    public Data Data { get; set; } 
} 
+0

實際上,將[KnownType]屬性放在Data類上更有意義。 – 2010-07-01 15:16:03

+0

這幾乎就在那裏。問題在於它如何串聯。您最終得到一個像而不是的節點。 – Maleks 2010-07-01 16:25:34