Передать параметр в Swashbuckle OperationFilter - PullRequest
0 голосов
/ 14 ноября 2018

У меня есть метод действия, который требует пользовательский заголовок.Я нашел этот код для добавления пользовательского заголовка в пользовательский интерфейс.

public class AddRequiredHeaderParameter : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        if (operation.parameters == null)
            operation.parameters = new List<Parameter>();

        operation.parameters.Add(new Parameter
            {
                name = "Foo-Header",
                @in = "header",
                type = "string",
                required = true
            });
    }
} 

Но я хочу использовать его в других методах, которые могут требовать другого имени пользовательского заголовка.Примерно так, где я могу передать имя настраиваемого заголовка конструктору.

public class CustomHeaderOperationFilter : IOperationFilter
    {
        private string _headerName;

        public CustomHeaderOperationFilter(string headerName)
        {
            _headerName = headerName;
        }

        public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
        {
            if (operation.parameters == null)
                operation.parameters = new List<Parameter>();

            operation.parameters.Add(new Parameter
            {
                name = _headerName,
                type = "string",
                @in = "header",
                required = true,
            });
        }
    }

И я хочу назначить его только определенному методу Action, поэтому я надеялся, что смогу украсить метод action с помощьюатрибут вроде этого:

[SwaggerOperationFilter<CustomHeaderOperationFilter>("custom-header-name")]

Но, к сожалению, я могу только передать тип фильтра в атрибут.Есть ли способ добиться этого?

1 Ответ

0 голосов
/ 14 ноября 2018

Посмотрев на код Swashbuckle, я решил создать собственный SwaggerCustomHeaderOperationFilterAttribute

public class SwaggerCustomHeaderOperationFilterAttribute : BaseCustomSwaggerOperationFilterAttribute
{
    public SwaggerCustomHeaderOperationFilterAttribute(string headerName, string headerDescription, bool isRequired)
    {
        OperationFilter = new CustomHeaderOperationFilter(headerName, headerDescription, isRequired);
    }
}

Наследование от:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)]
public class BaseCustomSwaggerOperationFilterAttribute : Attribute
{
    public IOperationFilter OperationFilter { get; protected set; }
}

И пользовательский ApplyCustomSwaggerOperationFilterAttributes:

public class ApplyCustomSwaggerOperationFilterAttributes : IOperationFilter
{
    public void Apply(Operation operation, SchemaRegistry schemaRegistry, ApiDescription apiDescription)
    {
        var attributes = apiDescription.GetControllerAndActionAttributes<BaseCustomSwaggerOperationFilterAttribute>();

        foreach (var attribute in attributes)
        {
            attribute.OperationFilter.Apply(operation, schemaRegistry, apiDescription);
        }
    }
}

Таким образом, я могу украсить свой метод Action с помощью

[SwaggerCustomHeaderOperationFilter("header-name", "header-description", true)]
...