使用 Swashbuckle 对 Swagger 页面的模式部分进行排序

Sorting the Schemas portion of a Swagger page using Swashbuckle

在我的 Swagger 页面上,我(大部分)能够在 Swashbuckle 页面上订购操作 as described

操作下方是“模式”部分,显示操作使用的数据结构。这些数据结构以任意顺序出现。我想对它们进行排序。

问题 Swagger sort Schema Defintions 表面上看起来像是同一个问题,但在那个问题中,“排序”的意思是“将项目分类到不同的容器中”,而不是“排序列表”我要。

我做了一个document filter“有效”的,但是当我看我写的代码时,我有点死在里面了。

有更正确的方法吗?

编辑:具体来说,我反对这段代码的原因是它通过对字典中的条目进行排序来“工作”,这很糟糕(请参阅 this question)。

原来答案只是使用 SortedDictionary:

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

实际上,您使用文档过滤器的方向是对的!

在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's suggestion whilst reporting a Sort Schema Issue on 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;
        }
    });
})