Настроить схему swagger для вложенного типа с помощью swashbuckle

У меня есть api (ASP.NET Core 3.0), который позволяет пользователям выполнять поиск в базе данных документов с использованием различных параметров запроса для фильтрации и упорядочивания результатов. Один из параметров - это параметр Order, который определяет порядок результатов. Допустимые значения ограничиваются значениями перечисления.

Теперь мне нужно добавить в перечисление больше поведения, поэтому я переписал его как Enumeration Class, чтобы я мог добавить к нему объектно-ориентированное поведение. Проблема, с которой я столкнулся, заключается в том, что Swashbuckle выравнивает свойства Enumeration, а не оставляет его как один параметр. Вот мои классы перечисления и параметров:

// Enumeration
public class DocSearchOrder : Enumeration {
    public static readonly DocSearchOrder DocType = new DocSearchOrder(2, nameof(DocType));
    public static readonly DocSearchOrder DocTypeDesc = new DocSearchOrder(3, nameof(DocTypeDesc));
    public static readonly DocSearchOrder DocDate = new DocSearchOrder(4, nameof(DocDate));
    public static readonly DocSearchOrder DocDateDesc = new DocSearchOrder(5, nameof(DocDateDesc));

    public DocSearchOrder(int value, string name) : base(value, name) {
    }
}

// Search Parameters
public class DocSearchParameters {

    public DocSearchOrder? Order { get; set; }

    // Lots of other search parameters
}

Затем метод, который его использует:

public async Task<IActionResult> GetAsync([FromQuery] DocSearchParameters searchParams) {
    // Do the search
}

Swashbuckle превращает searchParams.Order в DocSearchOrder.Id и DocSearchOrder.Name. Я хочу добиться того, чтобы мой пользовательский интерфейс Swagger продолжал отображать раскрывающийся список доступных значений (DocSearchOrder.Name), которые пользователь может выбрать с помощью параметра с именем «Порядок». Затем вы передаете одно из этих строковых значений, и настраиваемый связыватель модели преобразует строку в экземпляр класса Enumeration.

Я пробовал написать собственный IOperationFilter, но он работает только для изменения схемы типов, переданных методу GetAsync, я не могу перехватить генерацию схемы для searchParams.Order. Я думал, что смогу каким-то образом перехватить генерацию схемы для любого свойства, которое является Enumeration, и сгенерировать для него схему перечисления вместо схемы объекта, но я не знаю, как ее перехватить.

Итак, мой вопрос: есть ли способ настроить генерацию схемы для вложенного типа? Или есть другой способ сделать это, и я все делаю неправильно? :)


person starx207    schedule 01.10.2019    source источник


Ответы (1)


Как насчет обычного перечисления:

    public enum DocSearchOrder
    {
        DocType = 2,
        DocTypeDesc = 3,
        DocDate = 4,
        DocDateDesc = 5
    }

Думаю, это было бы проще, и это не должно доставить вам особых хлопот.
Вот пример из одного из моих:
http://swagger-net-test.azurewebsites.net/swagger/ui/index?filter=TestEnum#/TestEnum/TestEnum_Get

person Helder Sepulveda    schedule 01.10.2019
comment
Да, я сейчас использую обычное перечисление. Я хотел переключиться на использование класса Enumeration, чтобы добавить некоторые дополнительные функции к членам перечисления, не полагаясь на кучу операторов if..else или switch. - person starx207; 05.10.2019