2014-06-22 17 views
8

Mam pytanie dotyczące stron pomocy API ASP.NET Web API.Strona pomocy ASP.NET Web API Strona nie może przetworzyć Generic Type Controller

Zazwyczaj HelpPages może generować WebAPI przez XMLDocumentation Kodeksu próbki:

public class ValueControllerBase : ApiController 
{ 
    /// <summary> 
    /// Base Do 
    /// </summary> 
    public IEnumerable<string> Do() 
    { 
     return new string[] { "value1", "value2" }; 
    } 
} 

public class ValuesController : ValueControllerBase 
{ 
    /// <summary> 
    /// Testing API 
    /// </summary> 
    public string Get(int id) 
    { 
     return "value"; 
    } 
} 

ten może generować powodzeniem, podobnie jak to:

API 
GET api/Values/Get/{id} 

Description 
Testing API 

API 
POST api/Values/Do 

Description 
Base Do 

ale jeśli mogę użyć rodzajowe podstawowy kontroler, to nie będzie wygenerować dokument API.

Próbka:

public class ValueControllerBase<T> : ApiController 
{ 
    /// <summary> 
    /// Base Do 
    /// </summary> 
    public IEnumerable<string> Do() 
    { 
     return new string[] { "value1", "value2" }; 
    } 
} 

public class ValuesController<String> : ValueControllerBase 
{ 
    /// <summary> 
    /// Testing API 
    /// </summary> 
    public string Get(int id) 
    { 
     return "value"; 
    } 
} 

Gdybym użyć kodu w sekcji drugiej, HelpPages może wygenerować dokument API, ale nie generuje adnotacji API. Różnica między moimi dwoma przykładami polega na tym, że kod drugiej sekcji używa typu ogólnego.

API 
GET api/Values/Get/{id} 

Description 
Testing API 

API 
POST api/Values/Do 

Description 
null 

W metodzie Do(), adnotacja nie wykazuje w porównaniu z pierwszym

Czy istnieje rozwiązanie, aby rozwiązać te problemy?

Odpowiedz

12

Udało mi się rozwiązać ten problem poprzez dostosowanie kodu w XmlDocumentationProvider.

Oryginalny przeróbka XmlDocumentationProvider.GetTypeName(Type) jest następujący:

private static string GetTypeName(Type type) 
{ 
    string name = type.FullName; 
    if (type.IsGenericType) 
    { 
     // Format the generic type name to something like: Generic{System.Int32,System.String} 
     Type genericType = type.GetGenericTypeDefinition(); 
     Type[] genericArguments = type.GetGenericArguments(); 
     string genericTypeName = genericType.FullName; 

     // Trim the generic parameter counts from the name 
     genericTypeName = genericTypeName.Substring(0, genericTypeName.IndexOf('`')); 
     string[] argumentTypeNames = genericArguments.Select(t => GetTypeName(t)).ToArray(); 
     name = String.Format(CultureInfo.InvariantCulture, "{0}{{{1}}}", genericTypeName, String.Join(",", argumentTypeNames)); 
    } 
    if (type.IsNested) 
    { 
     // Changing the nested type name from OuterType+InnerType to OuterType.InnerType to match the XML documentation syntax. 
     name = name.Replace("+", "."); 
    } 

    return name; 
} 

Nie wiem dlaczego, ale starają się utworzyć nazwę typu dla odnośnika xml zawierać rzeczywiste cechy rodzajowe, zamiast rodzajowy wpisz samą nazwę (na przykład tworzą Nullable {bool} zamiast Nullable`1). Tylko nazwa rodzajowa jest zdefiniowana w pliku xml.

Prosta zmiana kodu pobiera go do nazwy/odniesienie do dokumentacji dla klasy generycznej prawidłowo:

.... 
if (type.IsGenericType) 
{ 
    Type genericType = type.GetGenericTypeDefinition(); 
    name = genericType.FullName; 
} 
.... 

Po dokonaniu tej zmiany, adnotacje zaczął poprawnie wyświetlane dla typów generycznych, a dla mnie, to też niczego nie złamało.

+0

Z drugiej strony, łamie to uzyskanie dokumentacji dotyczącej metod z parametrami zerowymi. –

+0

@MotlicekPetr Mam to zaimplementowane, ale nie widzę go złamanie dokumentacji parametru nullable. Czy masz przykład? –

Powiązane problemy