Как сочетать фильтры Swashbuckle? - PullRequest
0 голосов
/ 22 апреля 2019

Мне нужно использовать какое-то условие, чтобы скрыть или показать некоторые свойства модели в Модель | Пример Значение ответа в Swagger UI.

Как это могло быть реализовано?Мое состояние основано на атрибутах API-действий и свойствах DTO.Так, например, если действие предоставляет атрибут, мы должны видеть только помеченные свойства в Swagger UI.

1 Ответ

1 голос
/ 25 апреля 2019

решаемая. Вам нужно только реализовать 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>();   
...