Проблема Swashbuckle / Swagger с XML комментариями при использовании SnakeCaseNamingStrategy от Newtonsoft - PullRequest
0 голосов
/ 25 февраля 2020

ОБНОВЛЕНИЕ: Похоже, что именно Newtonsoft SnakeCaseNamingStrategy вызвал эту проблему с XML комментариями. Есть ли способ получить эту стратегию именования, чтобы получить правильные XML комментарии для свойств с несколькими словами в их названии? XML комментариев не найдено для свойств модели с добавлением символов подчеркивания.

Я пытаюсь задокументировать API, но соглашения строки запроса, используемые MVC, не соблюдаются от Swashbuckle / Swagger.

Я сейчас заменяю. NET По умолчанию Core QueryStringValueProviderFactory на SnakeCaseQueryStringValueProviderFactory для преобразования всех строк запроса в Snake Case, как показано ниже.

services
    .AddMvc(options =>
    {
        var factory = options.ValueProviderFactories.FirstOrDefault(f => f is QueryStringValueProviderFactory);
        var index = options.ValueProviderFactories.IndexOf(factory);

        if (index > -1)
        {
            options.ValueProviderFactories[index] = new SnakeCaseQueryStringValueProviderFactory();
        }
        else
        {
            options.ValueProviderFactories.Add(new SnakeCaseQueryStringValueProviderFactory());
        }
    });

Если я AddSwaggerGen, строки запроса будут в Pascal Case вместо Snake Case в документации по умолчанию, что неверно.

Я попытался исправить это на уровне ApiExplorer, определив ApiDescriptionProvider like:

public sealed class SnakeCaseApiDescriptionProvider : IApiDescriptionProvider
{
    public int Order => 20390239;

    public void OnProvidersExecuted(ApiDescriptionProviderContext context)
    {
    }

    public void OnProvidersExecuting(ApiDescriptionProviderContext context)
    {
        foreach (var parameter in context.Results.SelectMany(x => x.ParameterDescriptions).Where(x => x.Source.Id == "Query" || x.Source.Id == "Path"))
        {
            parameter.Name = parameter.Name.ToSnakeCase();
        }
    }
}

Который был зарегистрирован на Startup like:

services
        .TryAddEnumerable(ServiceDescriptor.Transient<IApiDescriptionProvider, SnakeCaseApiDescriptionProvider>());

Однако это нарушает комментарии XML для любых свойств с несколькими словами в имени. Я предполагаю, что это потому, что имя параметра больше не соответствует имени в файле XML.

Например, эта модель:

public class Address
{
    /// <summary>
    /// Address 1.
    /// </summary>
    public string Address1 { get; set; }

    /// <summary>
    /// Address 2.
    /// </summary>
    public string Address2 { get; set; }

    /// <summary>
    /// City.
    /// </summary>
    public string City { get; set; }

    /// <summary>
    /// State.
    /// </summary>
    public string State { get; set; }

    /// <summary>
    /// Post Code
    /// </summary>
    public string PostCode { get; set; }

    /// <summary>
    /// Country.
    /// </summary>
    public string Country { get; set; }
}

Создает эту документацию в Swagger:

Incorrect documentation for PostCode

PostCode отсутствует его XML комментариев, поскольку имя было изменено на post_code.

  1. Есть ли способ заставить Swashbuckle сгенерировать свою документацию после того, как SnakeCaseQueryStringValueProviderFactory сделал свое дело?
  2. Или есть способ исправить SnakeCaseApiDescriptionProvider, чтобы по-прежнему находить комментарии XML для любых параметров, измененных на Snake Case?
  3. Или есть другой способ сделать это, о котором я не знаю без этих проблем?

Спасибо.

...