.NET Core 2.1 Swashbuckle组控制器(按区域)

时间:2018-11-27 17:37:06

标签: asp.net-core swagger asp.net-core-2.1 swashbuckle

我的情况很简单。我有一个非常大的.NET Core 2.1 MVC / WebApi,分为几个区域,分别代表系统的不同模块。我使用Swagger(SwashBuckle),效果很好。我的路由就像{area}/{controller}/{action}

在Swagger UI中,每个动作都被分组到控制器中(标准行为)。我的控制器和操作列表变得非常庞大且难以掌握。因此,我很想Swagger可以将我的控制器划分到不同的区域!可以折叠area xarea x中的每个控制器。

我真的很想念此功能或自己实现的方法!任何想法表示赞赏!

更新

我尝试用标签注释动作。

这给了我

- Area 1
    - MethodFromControllerA()
    - MethodFromControllerB()
- Area 2
    - MethodFromControllerC()
    - MethodFromControllerD()

我想要什么:

- Area 1
    - ControllerA
        - MethodFromControllerA()
    - ControllerB
        - MethodFromControllerB()
- Area 2
    - ControllerC
        - MethodFromControllerC()
    - ControllerD
        - MethodFromControllerD()

更新2

另一种选择是针对我的每个领域制定几个规范。就像每个区域的不同Swagger UI一样。可能吗?

2 个答案:

答案 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 } };
            }
        }
    }
}