我的情况很简单。我有一个非常大的.NET Core 2.1 MVC / WebApi,分为几个区域,分别代表系统的不同模块。我使用Swagger(SwashBuckle),效果很好。我的路由就像{area}/{controller}/{action}
。
在Swagger UI中,每个动作都被分组到控制器中(标准行为)。我的控制器和操作列表变得非常庞大且难以掌握。因此,我很想Swagger可以将我的控制器划分到不同的区域!可以折叠area x
和area x
中的每个控制器。
我真的很想念此功能或自己实现的方法!任何想法表示赞赏!
更新
我尝试用标签注释动作。
这给了我
- Area 1
- MethodFromControllerA()
- MethodFromControllerB()
- Area 2
- MethodFromControllerC()
- MethodFromControllerD()
我想要什么:
- Area 1
- ControllerA
- MethodFromControllerA()
- ControllerB
- MethodFromControllerB()
- Area 2
- ControllerC
- MethodFromControllerC()
- ControllerD
- MethodFromControllerD()
更新2
另一种选择是针对我的每个领域制定几个规范。就像每个区域的不同Swagger UI一样。可能吗?
答案 0 :(得分:0)
您首先需要安装annotations并在启动时启用它们:
services.AddSwaggerGen(c =>
{
c.EnableAnnotations();
});
然后,您需要将“区域”作为标签添加到每个操作中。
[SwaggerOperation(
Tags = new[] { "Area51" }
)]
当您打开swagger ui时,应该立即按标签将其自动分组(默认情况下,控制器名称为所选标签)。
当前无法使用现有的swagger ui生成器对端点进行进一步的嵌套分组。
答案 1 :(得分:0)
如果您仍然希望按区域名称执行此操作,这是在 Swashbuckle.AspNetCore 中执行此操作的完整代码:
c.OperationFilter<TagByAreaNameOperationFilter>();
public class TagByAreaNameOperationFilter : IOperationFilter
{
public void Apply(OpenApiOperation operation, OperationFilterContext context)
{
if (context.ApiDescription.ActionDescriptor is ControllerActionDescriptor controllerActionDescriptor)
{
var areaName = controllerActionDescriptor.ControllerTypeInfo.GetCustomAttributes(typeof(AreaAttribute), true)
.Cast<AreaAttribute>().FirstOrDefault();
if (areaName != null)
{
operation.Tags = new List<OpenApiTag> { new OpenApiTag { Name = areaName.RouteValue } };
}
else
{
operation.Tags = new List<OpenApiTag> { new OpenApiTag { Name = controllerActionDescriptor.ControllerName } };
}
}
}
}