Валидация данных в C# (.NET) с FluentValidation: полное руководство

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Валидация данных в 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                    

Рекомендаций