使用 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;
}
});
})
在我的 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;
}
});
})