Fluent Validation Nedir? .NET Core’da Fluent Validation Kullanımı

Can Yüksel

Erdoğancan Yüksel

2 dakika 21 saniye okuma süresi

Fluent validation, bir nesnenin geçerli olup olmadığını kontrol ederek ilgili nesne üzerinde doğrulama işlemlerini gerçekleştirmek amacıyla kullanılan popüler bir doğrulama kütüphanesidir. Fluent Validation, validasyon işlemlerinin basit, okunabilir ve genişletilebilir bir şekilde gerçekleştirilmesini sağlamaktadır.

fluent-validation-nedir

Fluent Validation Nedir?

Fluent Validation, .NET uygulamalarında kullanıcı girdilerinin kolay ve sade bir şekilde doğrulanmasını sağlayarak validasyon işlemlerini basit, okunabilir ve kolayca genişletilebilir bir şekilde gerçekleştirilmesini sağlamaktadır.

Fluent validation kullanımının en önemli avantajlarından birisi nesne yönelimli programlamada model doğrulama işlemleri için kompleks şartların gerektiği durumlarda if-else kullanımının karmaşıklığını ortadan kaldırılabilmesidir.

Fluent Validation Kurulumu

NuGet paket yöneticisi kullanılarak Fluent Validation kütüphanesini projeye eklemek için aşağıdaki komut kullanılabilir:

-> Install-Package FluentValidation

.NET CLI kullanrak terminal üzerinden yüklemek için:

-> dotnet add package FluentValidation

Veya Solution üzerinden “Manage Nuget Packages for Solution” seçeneğine tıklayarak aşağıdaki görseldeki kütüphaneleri projenize ekleyebilirsiniz.

Fluent Validation Kullanımı

İlgili özelliğin programın derlemesi sırasında görünmesi için Startup.cs sınıfınınConfigureServices metodunda AddFluentValidation eklentisini kullanarak geçerlilik kurallarını tanımlayabilirsiniz:

public void ConfigureServices(IServiceCollection services)
{
    // FluentValidation ekliyoruz
    services.AddControllers()
        .AddFluentValidation(fv =>
        {
            // Belirli bir assembly'den doğrulayıcıları tarayıp ekler
            fv.RegisterValidatorsFromAssemblyContaining<Startup>();
        });

    // Ayrıca manuel olarak bir doğrulayıcı ekleyebilirsiniz
    services.AddScoped<IValidator<User>, UserValidator>();
}

.NET 6.0 versiyonundan sonra Startup.cs bulunmadığından dolayı Program.cs'te kullanımı:

var builder = WebApplication.CreateBuilder(args);

// Fluent Validation'ı servis koleksiyonuna ekliyoruz
builder.Services.AddControllers()
    .AddFluentValidation(config =>
    {
        // Tüm Validator sınıflarını otomatik olarak tarayıp kaydeder
        config.RegisterValidatorsFromAssemblyContaining<Program>();
    });

// Servis kayıtları
builder.Services.AddScoped<IValidator<UserRegistrationModel>, UserRegistrationValidator>();

var app = builder.Build();

Bir sınıf üzerinde validasyon işlemi uygulanması için öncelikle AbstractValidator sınıfından türeyen bir sınıf oluşturulması gerekmektedir.

using FluentValidation;

public class User
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Email { get; set; }
    public int Age { get; set; }
    public string Password { get; set; }
    public string PhoneNumber { get; set; }
    public DateTime DateOfBirth { get; set; }
}

public class UserValidator : AbstractValidator<User>
{
    public UserValidator()
    {
        RuleFor(x => x.FirstName)
            .NotEmpty().WithMessage("Ad alanı boş bırakılamaz.")
            .Length(2,50).WithMessage("Ad alanı en az 2 en fazla 50 karakter olmalıdır.");

        RuleFor(x => x.LastName)
            .NotEmpty().WithMessage("Soyad alanı boş bırakılamaz.")
            .Length(2,50).WithMessage("Soyad alanı en az 2 en fazla 50 karakter olmalıdır.");

        RuleFor(x => x.Email)
            .NotEmpty().WithMessage("E-posta alanı boş bırakılamaz.")
            .EmailAddress().WithMessage("Geçerli bir e-posta adresi giriniz.");

        RuleFor(x => x.Age)
            .NotEmpty().WithMessage("Yaş alanı boş bırakılamaz.")
            .InclusiveBetween(18, 99).WithMessage("Yaş 18 ile 99 arasında olmalıdır.");

        RuleFor(x => x.Password)
            .NotEmpty().WithMessage("Password alanı boş bırakılamaz.")
            .MinimumLength(6).WithMessage("Şifreniz en az 6 karakterden oluşmalıdır.");

        RuleFor(x => x.PhoneNumber)
            .NotEmpty().WithMessage("Telefon numarası boş bırakılamaz.")
            .Matches(@"^\+(?:[0-9] ?){6,14}[0-9]$").WithMessage("Geçerli bir telefon numarası giriniz.");

        RuleFor(x => x.DateOfBirth)
          .NotEmpty().WithMessage("Doğum tarihi alanı gereklidir.")
          .Must(BecomeAnAdultRule).WithMessage("Yetişkin olmadığınız için kayıt olamazsınız.");
    }

    private bool BecomeAnAdultRule(DateTime dateOfBirth)
    {
        int currentYear = DateTime.Today.Year;
        int birthYear = dateOfBirth.Year;
        return currentYear - birthYear >= 18;
    }
}

Oluşturulan kuralların bir sınıf üzerinde uygulandığı kod örneği:

// Kullanımı
User user = new User
{
    FirstName = "Test",
    LastName = "Test",
    Email = "john.doe@example.com",
    Age = 19,
    Password = "12345", // Hatalı: Minimum uzunluk 6 olmalı
    PhoneNumber = "+90055555555",
    DateOfBirth = new DateTime(2010, 1, 1) // Hatalı: Yaşı 18'den küçük
};

UserValidator validator = new UserValidator();
var result = validator.Validate(user);

if (!result.IsValid)
{
    foreach (var error in result.Errors)
    {
        Console.WriteLine($"Hatalı girilen alan: {error.PropertyName}, Hata: {error.ErrorMessage}");
    }
}

// # Output
Hatalı girilen alan: Password, Hata: Şifreniz en az 6 karakterden oluşmalıdır.
Hatalı girilen alan: DateOfBirth, Hata: Yetişkin olmadığınız için kayıt olamazsınız.

 Sonuç olarak Fluent Validaton kullanarak doğrulama işlemleri esnek ve okunabilir hale getirilebilir. Standart doğrulama kurallarının yanı sıra özelleştirilmiş kurallar da eklenerek veri doğrulaması yapılabilmektedir.