У меня есть 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
, и сгенерировать для него схему перечисления вместо схемы объекта, но я не знаю, как ее перехватить.
Итак, мой вопрос: есть ли способ настроить генерацию схемы для вложенного типа? Или есть другой способ сделать это, и я все делаю неправильно? :)