Сортировка части схемы страницы Swagger с помощью Swashbuckle

На моей странице Swagger я (в основном) могу упорядочить операции, как описано на странице Swashbuckle.

Под операциями находится раздел "Схемы", показывающий структуры данных, используемые действиями. Эти структуры данных появляются в произвольном порядке. Я хотел бы их отсортировать.

Вопрос " Определения схемы сортировки Swagger" внешне выглядит как тот же вопрос, но в этом вопросе "сортировка" используется в смысле "сортировки элементов по разным ячейкам", а не "упорядочивания списка", чего я хочу.

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

Есть ли более правильный способ сделать это?

Изменить: Чтобы быть конкретным, я возражаю против этого кода, так это то, что он "работает" путем сортировки записей в Словаре, что просто плохо (см. Этот вопрос).

Оказывается, ответ заключался в простом использовании SortedDictionary:

        openApiDoc.Components.Schemas = new System.Collections.Generic.SortedDictionary<string, OpenApiSchema>(openApiDoc.Components.Schemas);

2 ответа

Решение

На самом деле, с фильтром документов вы были на правильном пути!

В Startup.cs ConfigureServices метод:-

services.AddSwaggerGen(c =>
{
    // ...

    // For our document filtering needs.
    c.DocumentFilter<DocumentFilter>();
});

А вот реализация фильтра документов:-

using System.Linq;

public class DocumentFilter : IDocumentFilter
{
    public DocumentFilter()
    {
    }

    // Implements IDocumentFilter.Apply().
    public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
    {
        if (swaggerDoc == null)
            return;

        // Re-order the schemas alphabetically.
        swaggerDoc.Components.Schemas = swaggerDoc.Components.Schemas.OrderBy(kvp => kvp.Key, StringComparer.InvariantCulture)
            .ToDictionary(kvp => kvp.Key, kvp => kvp.Value);
    }
}

when I look at the code I wrote, I die a little inside - окунитесь во славу LINQ, и вы будете гордиться своим кодом!

Для меня это не изменило бы окончательный порядок отображения, но сработало предложение MikeBeaton при сообщении о проблеме со схемой сортировки на GitHubотлично .

      app.UseSwagger(c =>
{
    c.PreSerializeFilters.Add((swagger, _) =>
    {
        if (swagger.Components != null && swagger.Components.Schemas != null)
        {
            var replacement = new Dictionary<string, OpenApiSchema>();
            foreach (var kv in swagger.Components.Schemas.OrderBy(p => p.Key))
            {
                replacement.Add(kv.Key, kv.Value);
            }
            swagger.Components.Schemas = replacement;
        }
    });
})
Другие вопросы по тегам