Правила FluentValidation
Пишите выразительные валидаторы с помощью цепочного синтаксиса.
«Правила FluentValidation» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Зачем нужен FluentValidation
FluentValidation — популярная библиотека .NET, которая переносит правила проверки из моделей в отдельные классы валидаторов. Правила выражаются с помощью понятного API с цепочками вызовов, благодаря чему модели остаются чистыми, а правила удобно тестировать.
dotnet add package FluentValidation
dotnet add package FluentValidation.DependencyInjectionExtensionsБазовый класс AbstractValidator
Чтобы написать валидатор, унаследуйте его от AbstractValidator<T>, где T — проверяемая модель. Правила определяются в конструкторе.
using FluentValidation;
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
// rules go here
}
}Определение первого правила с помощью RuleFor
RuleFor выбирает свойство через лямбда-выражение, после чего к нему можно присоединить цепочку валидаторов. NotEmpty() отклоняет значения null, пустые строки и значения по умолчанию.
public class CustomerValidator : AbstractValidator<Customer>
{
public CustomerValidator()
{
RuleFor(c => c.Name).NotEmpty();
}
}Объединение нескольких валидаторов в цепочку
Для каждого RuleFor можно объединить в цепочку несколько валидаторов. Они выполняются по порядку, и все должны пройти проверку. Такая запись почти читается как предложение.
RuleFor(c => c.Name)
.NotEmpty()
.MinimumLength(2)
.MaximumLength(50);Встроенные валидаторы
FluentValidation поставляется со множеством валидаторов: NotNull, NotEmpty, EmailAddress, Length, InclusiveBetween, GreaterThan, Matches (регулярное выражение) и другими.
RuleFor(c => c.Email).NotEmpty().EmailAddress();
RuleFor(c => c.Age).InclusiveBetween(18, 120);
RuleFor(c => c.Phone).Matches(@"^\+?[0-9]{7,15}$");Пользовательские сообщения об ошибках
Используйте WithMessage, чтобы заменить сообщение по умолчанию. Можно подставлять значения в шаблоны с помощью заполнителей, например {PropertyName} и {PropertyValue}.
RuleFor(c => c.Email)
.NotEmpty().WithMessage("Email is required.")
.EmailAddress().WithMessage("{PropertyValue} is not a valid email.");Пользовательские коды ошибок и уровень важности
Помимо сообщения можно добавить машиночитаемый код с помощью WithErrorCode и указать уровень важности через WithSeverity (ошибка, предупреждение, информация), чтобы клиенты могли по-разному реагировать на результаты.
RuleFor(c => c.Name)
.NotEmpty()
.WithErrorCode("NAME_REQUIRED")
.WithSeverity(Severity.Error);Проверка вложенных объектов
Используйте SetValidator, чтобы повторно использовать валидатор для дочернего объекта и сохранить правила модульными.
public class OrderValidator : AbstractValidator<Order>
{
public OrderValidator()
{
RuleFor(o => o.Customer).SetValidator(new CustomerValidator());
}
}Проверка коллекций
RuleForEach применяет правила к каждому элементу коллекции.
public class OrderValidator : AbstractValidator<Order>
{
public OrderValidator()
{
RuleForEach(o => o.Items)
.ChildRules(item => item.RuleFor(i => i.Quantity).GreaterThan(0));
}
}Ручной запуск валидатора
Вы можете напрямую вызвать валидатор и проверить результат. ValidationResult предоставляет IsValid и список Errors.
var validator = new CustomerValidator();
ValidationResult result = validator.Validate(customer);
if (!result.IsValid)
{
foreach (var error in result.Errors)
{
Console.WriteLine(error.PropertyName + ": " + error.ErrorMessage);
}
}Асинхронная проверка
Если для правила требуется ввод-вывод, например обращение к базе данных, используйте ValidateAsync и асинхронные валидаторы, такие как MustAsync, которые мы рассмотрим в уроке о пользовательских правилах.
ValidationResult result = await validator.ValidateAsync(customer);Быстрая проверка
Проверьте свои знания основ FluentValidation.
Итоги
FluentValidation размещает правила в классах AbstractValidator<T>. RuleFor выбирает свойство, после чего можно объединить в цепочку встроенные валидаторы, такие как NotEmpty, EmailAddress и InclusiveBetween. Настраивайте обратную связь с помощью WithMessage, WithErrorCode и WithSeverity, повторно используйте логику с помощью SetValidator и RuleForEach, а запускайте правила через Validate/ValidateAsync.
Часто задаваемые вопросы
Урок «Правила FluentValidation» бесплатный?
Да — полный текст урока «Правила FluentValidation» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Правила FluentValidation»?
Пишите выразительные валидаторы с помощью цепочного синтаксиса. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Правила FluentValidation»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Проверка с помощью аннотаций данных
- Правила FluentValidation
- Пользовательские и условные правила
- Интеграция проверки с API