Настройте схему swagger для вложенного типа, используя swashbuckle - PullRequest
0 голосов
/ 01 октября 2019

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

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

// 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), из которых пользователь может выбрать параметр с именем «Order». Затем вы передаете одно из этих строковых значений, и пользовательский связыватель модели преобразует строку в экземпляр класса Enumeration.

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

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

1 Ответ

0 голосов
/ 01 октября 2019

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

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

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

...