Сортировка части схемы страницы 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;
}
});
})