2014-04-22 39 views
0

我使用ServiceStack v 3.9.71和ServiceStack.Text.EnumMemberSerializer程序集將枚舉序列化爲可讀文本。ServiceStack.Text.EnumMemberSerializer不能使用Swagger插件

這很好,我的枚舉值被序列化爲我使用EnumMemberAttribute指定的名稱。

但問題是,Swagger不使用我的名字。我的猜測是它只是在枚舉值上調用.ToString()方法,而不是EnumMemberAttribute值。

這裏是我設置序列化的順序。 (在APPHOST):

new EnumSerializerConfigurator() 
      .WithEnumTypes(new Type[] { typeof(MyEnum) }) 
      .Configure(); 

Plugins.Add(new SwaggerFeature()); 

它似乎沒有如果枚舉串行器之前或招搖功能被添加後設置爲重要。

回答

1

在我看來,我想出了一個更好的解決方案。我寫了一個擴展ApiAllowableValuesAttribute類:

public class ApiAllowableValues2Attribute : ApiAllowableValuesAttribute 
{ 
    public ApiAllowableValues2Attribute(string name, Type enumType) 
     : base(name) 
    { 
     List<string> values = new List<string>(); 

     var enumTypeValues = Enum.GetValues(enumType); 

     // loop through each enum value 
     foreach (var etValue in enumTypeValues) 
     { 
      // get the member in order to get the enumMemberAttribute 
      var member = enumType.GetMember(
       Enum.GetName(enumType, etValue)).First(); 

      // get the enumMember attribute 
      var enumMemberAttr = member.GetCustomAttributes(
       typeof(System.Runtime.Serialization.EnumMemberAttribute), true).First(); 

      // get the enumMember attribute value 
      var enumMemberValue = ((System.Runtime.Serialization.EnumMemberAttribute)enumMemberAttr).Value; 

      values.Add(enumMemberValue); 

     } 

     Values = values.ToArray(); 
    } 
} 

客戶對象:

public class MyClientObject 
{ 
    [Description("The name")] 
    public string Name {get;set;} 

    [Description("The client object type")] 
    [ApiAllowableValues2("MyEnum", typeof(MyEnum))] 
    public MyEnum MyEnum { get; set; } 
} 

現在,您不必再次指定名稱或擔心名稱變更破壞你揚鞭文檔。

2

在解析枚舉值時,您是正確的,Swagger代碼不使用ServiceStack.Text.EnumMemberSerializer。它只使用Enum.GetValueshere。請注意,這在v4中仍然相同。

您可以提交拉取請求以進行此更改,但我不熟悉EnumMemberSerialzer以及它如何允許檢索枚舉選項列表。您可以改爲使用用ApiAllowableValues裝飾的字符串屬性來實現該效果。

1

這裏是我想出了一個解決方案(與bpruitt - 戈達德的幫助,感謝隊友):

枚舉:

public enum MyEnum 
{ 
    [EnumMember(Value = "Value One")] 
    Value1 = 1, 
    [EnumMember(Value = "Value Two")] 
    Value2 = 2, 
    [EnumMember(Value = "Value Three")] 
    Value3 = 3 
} 

客戶對象:

public class MyClientObject 
{ 
    [Description("The name")] 
    public string Name {get;set;} 

    [Description("The client object type")] 
    [ApiAllowableValues("MyEnum", "Value One", "Value Two", "Value Three")] 
    public MyEnum MyEnum { get; set; } 
} 

AppHost內部:

new EnumSerializerConfigurator() 
      .WithEnumTypes(new Type[] { typeof(MyEnum) }) 
      .Configure(); 

現在enum已正確序列化,並且Swagger文檔是正確的。與此唯一的問題是在兩個不同的地方名稱。也許有一種方法通過單元測試來檢查名稱匹配。