文档中 API 方法的分组 - 是否有一些自定义属性
Grouping of API methods in documentation - is there some custom attribute
我有这样的控制器
public class UserController : ApiController
{
[Route("api/user")]
IHttpActionResult GetUser() { ... }
}
public class ResumeController : ApiController
{
[Route("api/user/resumes")]
IHttpActionResult GetResumes() { ... }
}
哪个 swagger 会生成如下输出
有没有办法(除了通过推出您自己的 ISwaggerProvider
或将两个控制器合并为一个来覆盖默认实现之外)强制执行组名称?像
public class UserController : ApiController
{
[Route("api/user")]
[MagicalAttributeName(Group="User")]
IHttpActionResult GetUser() { ... }
}
public class ResumeController : ApiController
{
[Route("api/user/resumes")]
[MagicalAttributeName(Group="User")]
IHttpActionResult GetResumes() { ... }
}
有一种方法——虽然没有神奇的属性——你可以在swagger启动配置中更改默认的分组规则,以引入你自己的自定义属性。
GlobalConfiguration.Configuration
.EnableSwagger(c => {
c.GroupActionsBy(apiDesc => apiDesc
.GetControllerAndActionAttributes<MethodGroupAttribute>().Any() ?
apiDesc.GetControllerAndActionAttributes<MethodGroupAttribute()
.First().GroupName :
apiDesc.ActionDescriptor.ControllerDescriptor.ControllerName);
});
/// <summary>
/// Forces method to be displayed within specified group, regardless of controller
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class MethodGroupAttribute : Attribute
{
/// <summary>
/// Group name
/// </summary>
public string GroupName { get; private set; }
/// <summary>
/// ctor
/// </summary>
/// <param name="groupName"></param>
public MethodGroupAttribute(string groupName)
{
if (string.IsNullOrEmpty(groupName))
{
throw new ArgumentNullException("groupName");
}
GroupName = groupName;
}
}
用法:
[Route("api/user")]
[MethodGroup("User")]
IHttpActionResult GetUser() { ... }
您也可以使用 SwaggerOperationAttribute:
public class UserController : ApiController
{
[Route("api/user")]
[SwaggerOperation(Tags = new[] { "User" })]
IHttpActionResult GetUser() { ... }
}
public class ResumeController : ApiController
{
[Route("api/user/resumes")]
[SwaggerOperation(Tags = new[] { "User" })]
IHttpActionResult GetResumes() { ... }
}
我知道现在已经很晚了,但留下答案认为它会有用。
你可以使用ApiExplorerSettings,这是你的魔法属性。
像这样...
public class UserController : ApiController
{
[Route("api/user")]
[ApiExplorerSettings(Group="User")]
IHttpActionResult GetUser() { ... }
}
public class ResumeController : ApiController
{
[Route("api/user/resumes")]
[ApiExplorerSettings(Group="User")]
IHttpActionResult GetResumes() { ... }
}
我有这样的控制器
public class UserController : ApiController
{
[Route("api/user")]
IHttpActionResult GetUser() { ... }
}
public class ResumeController : ApiController
{
[Route("api/user/resumes")]
IHttpActionResult GetResumes() { ... }
}
哪个 swagger 会生成如下输出
有没有办法(除了通过推出您自己的 ISwaggerProvider
或将两个控制器合并为一个来覆盖默认实现之外)强制执行组名称?像
public class UserController : ApiController
{
[Route("api/user")]
[MagicalAttributeName(Group="User")]
IHttpActionResult GetUser() { ... }
}
public class ResumeController : ApiController
{
[Route("api/user/resumes")]
[MagicalAttributeName(Group="User")]
IHttpActionResult GetResumes() { ... }
}
有一种方法——虽然没有神奇的属性——你可以在swagger启动配置中更改默认的分组规则,以引入你自己的自定义属性。
GlobalConfiguration.Configuration
.EnableSwagger(c => {
c.GroupActionsBy(apiDesc => apiDesc
.GetControllerAndActionAttributes<MethodGroupAttribute>().Any() ?
apiDesc.GetControllerAndActionAttributes<MethodGroupAttribute()
.First().GroupName :
apiDesc.ActionDescriptor.ControllerDescriptor.ControllerName);
});
/// <summary>
/// Forces method to be displayed within specified group, regardless of controller
/// </summary>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class MethodGroupAttribute : Attribute
{
/// <summary>
/// Group name
/// </summary>
public string GroupName { get; private set; }
/// <summary>
/// ctor
/// </summary>
/// <param name="groupName"></param>
public MethodGroupAttribute(string groupName)
{
if (string.IsNullOrEmpty(groupName))
{
throw new ArgumentNullException("groupName");
}
GroupName = groupName;
}
}
用法:
[Route("api/user")]
[MethodGroup("User")]
IHttpActionResult GetUser() { ... }
您也可以使用 SwaggerOperationAttribute:
public class UserController : ApiController
{
[Route("api/user")]
[SwaggerOperation(Tags = new[] { "User" })]
IHttpActionResult GetUser() { ... }
}
public class ResumeController : ApiController
{
[Route("api/user/resumes")]
[SwaggerOperation(Tags = new[] { "User" })]
IHttpActionResult GetResumes() { ... }
}
我知道现在已经很晚了,但留下答案认为它会有用。
你可以使用ApiExplorerSettings,这是你的魔法属性。
像这样...
public class UserController : ApiController
{
[Route("api/user")]
[ApiExplorerSettings(Group="User")]
IHttpActionResult GetUser() { ... }
}
public class ResumeController : ApiController
{
[Route("api/user/resumes")]
[ApiExplorerSettings(Group="User")]
IHttpActionResult GetResumes() { ... }
}