Валидация данных в C# (.NET): мощный инструмент FluentValidation
Валидация данных — один из ключевых аспектов разработки безопасных и надёжных приложений на C# (.NET). Независимо от того, создаёте ли вы веб-API на ASP.NET Core, десктопное приложение на WPF или консольную утилиту, проверка входных данных помогает избежать ошибок, SQL-инъекций и некорректной работы системы. В этой статье мы подробно рассмотрим библиотеку FluentValidation — современный, гибкий и широко используемый инструмент для валидации в экосистеме .NET.
Что такое FluentValidation и зачем он нужен?
FluentValidation — это open-source библиотека для .NET, которая позволяет описывать правила валидации объектов с помощью fluent-интерфейса (цепочки вызовов методов). В отличие от встроенных атрибутов DataAnnotations, FluentValidation:
- Разделяет логику валидации и модель данных — правила выносятся в отдельные классы-валидаторы.
- Поддерживает сложные сценарии — условные проверки, кастомные правила, кросс-свойственные проверки.
- Интегрируется с ASP.NET Core — автоматически проверяет модели в контроллерах.
- Упрощает тестирование — валидаторы можно легко изолировать и покрыть юнит-тестами.
Установка и настройка
Для начала работы установите пакет через NuGet Package Manager или .NET CLI:
dotnet add package FluentValidation
Если вы используете ASP.NET Core, добавьте в Program.cs (или Startup.cs) регистрацию валидаторов:
builder.Services.AddValidatorsFromAssemblyContaining<MyValidator>();
Создание простого валидатора
Предположим, у нас есть модель пользователя:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public int Age { get; set; }
}
Создадим валидатор, наследующий от AbstractValidator<User>:
using FluentValidation;
public class UserValidator : AbstractValidator<User>
{
public UserValidator()
{
RuleFor(user => user.Name)
.NotEmpty().WithMessage("Имя обязательно")
.Length(2, 50).WithMessage("Имя должно быть от 2 до 50 символов");
RuleFor(user => user.Email)
.NotEmpty().WithMessage("Email обязателен")
.EmailAddress().WithMessage("Некорректный формат Email");
RuleFor(user => user.Age)
.InclusiveBetween(18, 120).WithMessage("Возраст должен быть от 18 до 120 лет");
}
}
Теперь можно выполнить валидацию:
var validator = new UserValidator();
var user = new User { Name = "А", Email = "invalid", Age = 15 };
var result = validator.Validate(user);
if (!result.IsValid)
{
foreach (var error in result.Errors)
{
Console.WriteLine($"Ошибка в {error.PropertyName}: {error.ErrorMessage}");
}
}
Продвинутые возможности
1. Кастомные правила (Custom validators)
Можно написать свою логику проверки с помощью метода Must или создать отдельный метод:
RuleFor(user => user.Name)
.Must(name => !string.IsNullOrEmpty(name) && name.All(char.IsLetter))
.WithMessage("Имя должно содержать только буквы");
2. Условная валидация
Проверяйте свойства только при выполнении определённых условий:
RuleFor(user => user.Email)
.NotEmpty().When(user => user.Age > 18)
.WithMessage("Для взрослых пользователей Email обязателен");
3. Кросс-свойственная проверка
Сравнивайте значения разных свойств:
RuleFor(user => user.Password)
.Equal(user => user.ConfirmPassword)
.WithMessage("Пароли не совпадают");
4. Наборы правил (RuleSets)
Группируйте правила для разных сценариев (например, создание и обновление):
public UserValidator()
{
RuleSet("Create", () =>
{
RuleFor(user => user.Id).Equal(0).WithMessage("Id должен быть 0 при создании");
});
RuleSet("Update", () =>
{
RuleFor(user => user.Id).GreaterThan(0).WithMessage("Id должен быть больше 0");
});
}
// Использование:
var result = validator.Validate(user, ruleSet: "Create Также в библиотеке
Машинное обучение на JavaScript (Node.js): библиотеки для ML
Работа с датами в Rust: обзор библиотек для времени и дат
Генерация PDF отчётов на PHP: обзор библиотек и примеры
Авторизация и аутентификация в Kotlin: Ktor, JWT и Spring Security
Работа с изображениями в Kotlin: библиотеки, инструменты и примеры