Используйте проверку модели в минимальных API в ASP.NET Core 6.

автор vadim


При работе с приложениями в ASP.NET Core 6 вам часто потребуется проверить свои модели, чтобы убедиться, что содержащиеся в них данные соответствуют заранее определенным правилам проверки. Введите проверку модели.

В предыдущей статье мы обсуждали, как начать работу с минимальными API. В этой статье обсуждается, как использовать проверку модели в минимальных API.

Для работы с примерами кода, представленными в этой статье, в вашей системе должна быть установлена ​​Visual Studio 2022. Если у вас еще нет копии, вы можете скачать Visual Studio 2022 здесь.

Создайте минимальный проект веб-API ASP.NET Core в Visual Studio 2022.

Прежде всего давайте создадим проект ASP.NET Core в Visual Studio 2022. Выполнение этих шагов позволит создать новый проект ASP.NET Core Web API 6 в Visual Studio 2022:

  1. Запустите интегрированную среду разработки Visual Studio 2022.
  2. Нажмите «Создать новый проект».
  3. В окне «Создать новый проект» выберите «ASP.NET Core Web API» из списка отображаемых шаблонов.
  4. Нажмите “Далее.
  5. В окне «Настроить новый проект» укажите имя и местоположение нового проекта.
  6. При желании установите флажок «Поместить решение и проект в один каталог», в зависимости от ваших предпочтений.
  7. Нажмите “Далее.
  8. В следующем окне «Дополнительная информация» снимите флажок «Использовать контроллеры…», поскольку в этом примере мы будем использовать минимальные API. В поле «Тип аутентификации» оставьте значение «Нет» (по умолчанию).
  9. Убедитесь, что флажки «Включить Docker», «Настроить HTTPS» и «Включить поддержку Open API» сняты, поскольку мы не будем здесь использовать ни одну из этих функций.
  10. Нажмите Создать.

В результате будет создан новый проект веб-API ASP.NET Core 6 в Visual Studio 2022. Мы будем использовать этот проект для работы с проверкой модели в последующих разделах этой статьи.

Что такое валидация модели? Зачем это нужно?

Проверка модели — это метод, используемый для проверки состояния модели, т. е. для определения того, соответствуют ли данные в модели определенным правилам. Давайте разберемся в этом на примере. Предположим, у вас есть класс модели с именем «Продукт», в котором одним из полей является «Код продукта».

Теперь предположим, что вы определили атрибут в классе Product, согласно которому свойство «Код продукта» не может иметь значение, длиннее пяти символов. Если вы создадите экземпляр этого класса модели и назначите свойству «Код продукта» более пяти символов, проверка модели для этого объекта завершится неудачно.

В минимальных API нет встроенной поддержки проверки модели (в отличие от ASP.NET Core MVC и Razor Pages). Следовательно, вам нужно будет написать собственный код для проверки моделей в ваших минимальных приложениях API.

Установите пакет NuGet FluentValidation.AspNetCore.

В этой статье мы будем использовать библиотеку проверки FluentValidation, которая доступна в виде пакета NuGet. FluentValidation использует гибкий API и лямбда-выражения для создания правил проверки данных.

Теперь добавьте пакет NuGet FluentValidation.AspNetCore в свой проект. Для этого выберите проект в окне обозревателя решений, затем щелкните правой кнопкой мыши и выберите «Управление пакетами NuGet». В окне диспетчера пакетов NuGet найдите пакет FluentValidation.AspNetCore и установите его.

Кроме того, вы можете установить пакет через консоль диспетчера пакетов NuGet, введя команду, показанную ниже.

PM> Install-Package FluentValidation.AspNetCore

Создайте класс модели

Создайте новый класс с именем Product в файле с тем же именем и расширением .cs и введите туда следующий код.

public class Product
{
    public int Id { get; set; }
    public string Code { get; set; }
    public int Quantity { get; set; }
    public double Price { get; set; }
}

Это будет класс модели, который мы будем использовать для проверки.

Создайте класс ProductValidator.

Теперь предположим, что классу Product требуется валидатор, т. е. класс, который будет проверять свойства класса Product. Вы можете создать собственный валидатор, расширив абстрактный класс с именем AbstractValidator, как показано в приведенном ниже фрагменте кода.

public class ProductValidator : AbstractValidator<Product>
{
    public ProductValidator()
    {
        RuleFor(x => x.Id).NotNull();
        RuleFor(x => x.Code).Length(5);
        RuleFor(x => x.Quantity).NotNull();
        RuleFor(x => x.Price).InclusiveBetween(50.00, 250.00);
    }
}

Создайте интерфейс IProductRepository.

Репозиторий используется в приложении для сохранения данных в хранилище данных, таком как база данных или файловая система. В этом примере мы создадим простой репозиторий с методом с именем AddProduct, но поскольку здесь мы фокусируемся на проверке модели, мы не будем включать логику для добавления записи о продукте в базу данных.

Создайте интерфейс с именем IProductRepository и введите следующий код.

public interface IProductRepository
{
    public void AddProduct(Product product);
}

Создайте класс ProductRepository.

Класс ProductRepository реализует интерфейс IProductRepository, как показано ниже.

public class ProductRepository : IProductRepository
{
    public void AddProduct(Product product)
    {
        //Write your code here to add a product record to the database
    }
}

Зарегистрируйте классы валидатора и репозитория в Program.cs.

Зарегистрируйте типы ProductValidator и ProductRepository в файле Program.cs, используя следующий код.

builder.Services.AddScoped<IValidator<Product>, ProductValidator>();
builder.Services.AddScoped<IProductRepository, ProductRepository>();

Создайте конечную точку HttpPost в Program.cs.

Теперь напишите следующий код в файле Program.cs, чтобы создать конечную точку HttpPost.

app.MapPost("/product", async (IValidator<Product> validator, IProductRepository repository, Product product) =>
{
    var validationResult = await validator.ValidateAsync(product);
    if (!validationResult.IsValid)
    {
        return Results.ValidationProblem(validationResult.ToDictionary());
    }
    repository.AddProduct(product);
    return Results.Created($"/{product.Id}", product);
});

Обратите внимание, как были переданы валидатор параметров, репозиторий и продукт. Метод ValidateAsync вызывается для проверки экземпляра продукта.

Полный пример проверки модели

Полный исходный код файла Program.cs приведен ниже для справки.

using FluentValidation;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddScoped<IValidator<Product>, ProductValidator>();
builder.Services.AddScoped<IProductRepository, ProductRepository>();
var app = builder.Build();
// Configure the HTTP request pipeline.
app.MapPost("/product", async (IValidator<Product> validator, IProductRepository repository, Product product) =>
{
    var validationResult = await validator.ValidateAsync(product);
    if (!validationResult.IsValid)
    {
        return Results.ValidationProblem(validationResult.ToDictionary());
    }
    repository.AddProduct(product);
    return Results.Created($"/{product.Id}", product);
});
app.Run();

Выполнить приложение

Наконец, давайте запустим приложение и вызовем конечную точку HttpPost из Postman, чтобы увидеть проверку модели в действии. На рисунке 1 показаны результаты проверки модели. Обратите внимание на сообщения об ошибках в ответе.

ядро aspnet для проверки модели ИДГ

Рис. 1. Проверка модели в минимальном API в ASP.NET Core 6 с использованием библиотеки FluentValidation.

Вы также можете применять собственные валидаторы, используя интерфейс IValidatableObject. Этот интерфейс содержит метод Validate, который вам нужно будет реализовать самостоятельно. Для этого вам нужно создать класс модели, реализующий этот интерфейс и метод Validate. Я расскажу об использовании IValidatableObject в следующем посте.

Related Posts

Оставить комментарий