ジェネリック型の応答オブジェクトのドキュメントに関して、Swagger の ServiceStack 実装に問題があります。厳密に型指定された応答オブジェクトは正しく文書化されて表示されますが、ジェネリック型のオブジェクトが応答として使用されると、文書化は不正確になり、誤解を招きます。
DTO を要求する
[Route("/users/{UserId}", "GET", Summary = "Get a specific User Profile")]
public class GetUser : IReturn<ServiceResponse<UserProfile>>
{
[ApiMember(Description = "User Id", ParameterType = "path", IsRequired = true)]
public int UserId { get; set; }
}
応答 DTO
public class ServiceResponse<T> : IServiceResponse<T>
{
public IList<string> Errors { get; set; }
public bool Successful { get; set; }
public string Message { get; set; }
public string StackTrace { get; set; }
public T Data { get; set; }
public ServiceResponse()
{
Errors = new List<string>();
}
}
応答 DTO タイプ
public class UserProfile : RavenDocument
{
public UserProfile()
{
Races = new List<UserRace>();
Workouts = new List<Workout>();
}
public string FirstName { get; set; }
public string LastName { get; set; }
public string DisplayName { get; set; }
public DateTime? BirthDate { get; set; }
public Gender? Gender { get; set; }
public string UltracartPassword { get; set; }
public string UltracartCartId { get; set; }
[UniqueConstraint]
public string Email { get; set; }
public string ImageUrl { get; set; }
public FacebookUserInfo FacebookData { get; set; }
public GoogleUserInfo GoogleData { get; set; }
public DateTime CreatedOn { get; set; }
public DateTime? LastUpdated { get; set; }
public UserAddress ShippingAddress { get; set; }
public UserAddress BillingAddress { get; set; }
public IList<UserRace> Races { get; set; }
public IList<Workout> Workouts { get; set; }
}
例は非常に簡単です。ハックや巧妙なことは何もありませんが、これは私が Swagger からすぐに取得できるサンプル ドキュメントです。
ご覧のとおり、ジェネリック型は正しく文書化されておらず、代わりに他の型が使用されています。すべての応答に同じ ServiceResponse ラッパーを使用しているため、これは全体的に発生しています。