如何组合十字花式过滤器?

时间:2019-04-22 06:15:02

标签: c# asp.net-web-api swashbuckle

我需要使用某些条件在Swagger UI的响应的 Model |示例值中隐藏或显示模型的某些属性。

这怎么可能实现?我的条件基于api操作的属性和DTO的属性。因此,例如,如果一个动作提供了一个属性,那么我们应该只能在Swagger UI中看到标记的属性。

1 个答案:

答案 0 :(得分:0)

已解决。您只需要实现IOperationFilter并进行注册。这些东西使您可以显示同一模型的定制不同示例。


DTO

public class MyDTO
{
    public int Id { get; set; }

    [ShortModelMember]
    public string Name { get; set; }
    ...
}   

API控制器中的方法

[HttpGet]
[ReturnShortModel]
public MyDTO GetSmthg()
{
    return MyDTO.GetExample();
}   

Swagger的自定义操作过滤器

public class SwaggerExcludeFilter : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (!apiDescription.GetControllerAndActionAttributes<ReturnShortModelAttribute>().Any())
        {
            return;
        }

        var responseType = apiDescription.ResponseDescription.DeclaredType;
        var description = $"OK (uses a short model of {responseType})";
        var props = responseType
                    .GetProperties()
                    .Where(p => p.GetCustomAttributes(typeof(ShortModelMemberAttribute)).Any())
                    .ToDictionary(p => p.Name, p.PropertyType.Name);
        }

        operation.responses.Clear();
        operation.responses.Add("200", new Response
        {
            description = description,
            schema = new Schema
            {
                example = props,
            },
        });
    }
}   

最后

c.OperationFilter<SwaggerExcludeFilter>();