Swashbuckle SchemaFilter для параметров работы API - PullRequest
1 голос
/ 25 апреля 2019

Я успешно создал ISchemaFilter для расширения swagger.json определения свойств перечисления для целей генерации кода, как описано здесь .Вот мой текущий метод SchemaFilter.Apply:

public void Apply(Schema schema, SchemaFilterContext context)
{
    if (context.SystemType.IsEnum)
    {
        var names = Enum.GetNames(context.SystemType);
        var values = Enum.GetValues(context.SystemType);
        var desc = "";

        foreach (var value in values)
        {
            var intValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));
            desc += $"{intValue}={value},";
        }
        desc = desc.TrimEnd(',');
        schema.Extensions.Add("x-enumNames", names);
        schema.Extensions["description"] = desc;
    }
}

SchemaFilter правильно работает в определениях моей модели, где класс модели имеет член с типом enum.Ниже приведен пример вывода: resolution -поле, которое является типом перечисления, обратите внимание на пользовательские x-enumNames и измененные поля description:

resolution: {
    format: "int32",
    enum: [
        1,
        2,
        3,
        4
    ],
    type: "integer",
    x-enumNames: [
        "Hour",
        "Day",
        "Month",
        "Year"
    ],
    description: "1=Hour,2=Day,3=Month,4=Year"
}

Проблема в том, что SchemaFilter не расширяет типы перечислениякоторые находятся в рабочих параметрах .Например, следующий api-метод имеет параметр resolution:

public async Task<ActionResult<ReturnType>> GetData(Models.ResolutionEnum resolution)

И это приводит к следующему определению параметра операции для swagger.json (уведомление отсутствует x-EnumNames):

{
    name: "resolution",
    in: "query",
    required: true,
    type: "integer",
    format: "int32",
    enum: [
        1,
        2,
        3,
        4
    ]
}

IsЕсть ли какой-нибудь способ расширения расширенных схем перечисления, которые являются частью параметров метода?

Ответы [ 2 ]

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

Благодаря другому ответу на этот вопрос я обнаружил, что в пространстве имен Swashbuckle.AspNetCore.SwaggerGen есть несколько точек расширения. IParameterFilter - это как раз то, что я хочу, и я смог добавить x-enumNames в определения параметров метода.

Ниже приведен фильтр параметров, который я сделал:

public class ModifyParametersFilter : IParameterFilter
{
    public void Apply(IParameter parameter, ParameterFilterContext context)
    {
        var type = context.ParameterInfo?.ParameterType;
        if (type == null)
            return;
        if (type.IsEnum)
        {
            var names = Enum.GetNames(type);
            var values = Enum.GetValues(type);
            var desc = "";

            foreach (var value in values)
            {
                var intValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));
                desc += $"{intValue}={value},";
            }
            desc = desc.TrimEnd(',');
            if (!parameter.Extensions.ContainsKey("x-enumNames"))
                parameter.Extensions.Add("x-enumNames", names);
        }
    }
}

Как и другие фильтры, это можно активировать в Startup.cs со следующим фрагментом:

services.AddSwaggerGen(c =>
{
    ..
    c.ParameterFilter<ModifyParametersFilter>();
}
1 голос
/ 25 апреля 2019

Попробуйте с IDocumentFilter, я ввел x-stuff, используя его, вот пример:

public class InjectXStuff : IDocumentFilter
{
    public void Apply(SwaggerDocument s, DocumentFilterContext c)
    {
        PathItem path = s.Paths.Where(x => x.Key.Contains("Values")).First().Value;
        path.Post.Parameters.FirstOrDefault().Extensions.Add("x-stuff", "123456");
    }
}

проблема в том, что вам нужно знать путь в расширенном, не уверенный, есть ли шаблон, который вы можете использовать в своем коде, чтобы идентифицировать те, которые являются перечислениями ...

...