Я хочу динамически генерировать некоторые конечные точки во время инициализации приложения, поэтому минимальные API идеально подходят для этого. Очевидно, что они очень схожи с точки зрения функциональности и не имеют проверки модели с помощью атрибутов (например, [Required]
). Есть ли способ вручную подключить этап проверки обратно к минимальному API, или мне остались такие вещи, как FluentValidation?
Можно ли запустить проверку минимального API?
Да, вы можете это сделать, и этого можно достичь разными способами. Например, вы можете вручную проверить свою модель с помощью минимального метода API.
Кроме того, вы можете использовать конвейер промежуточного программного обеспечения, а также можно использовать беглую проверку.
Для проверки FluentV вам необходимо установить пакет fluent.
Итак, это полностью зависит от ваших требований и предпочтений.
Теперь давайте посмотрим, как мы могли бы реализовать это, используя метод ручной проверки.
В ядре asp.net у нас есть класс validationResult, который используется для инициализации нового экземпляра класса ValidationResult с использованием сообщения об ошибке и списка членов, имеющих ошибки проверки. Итак, мы могли бы использовать этот класс.
Чтобы использовать приведенный выше класс, мы могли бы взять модель запроса, используя Request.ReadFromJsonAsync
, а затем использовать ValidationContext
.
Наконец, в Validator.TryValidateObject мы можем передать модель, полученную по запросу.
Демо-модель:
public class MyModel
{
[Required]
public string Name { get; set; }
[Range(1, 100)]
public int Age { get; set; }
}
Минимальный API:
app.MapPost("/modelvalidation", async (HttpContext httpContext) =>
{
var request = await httpContext.Request.ReadFromJsonAsync<MyModel>();
var validationResults = new List<ValidationResult>();
var validationContext = new ValidationContext(request, null, null);
bool isValid = Validator.TryValidateObject(request, validationContext, validationResults, true);
if (!isValid)
{
return Results.BadRequest(validationResults);
}
return Results.Ok("Model is valid!");
});
Выход:
Примечание. Вы можете обратиться к этому официальному документу для получения дополнительной информации.
Да, просто используйте перехват на уровне DI. Понятия не имею, как это сделать с помощью атрибутов, не теряя при этом рассудка.