Giriş

Veri doğrulama, uygulamanızın hem güvenli hem de tutarlı çalışmasını sağlar. Özellikle katmanlı mimarilerde hem API katmanında hem de iş katmanında validasyon kuralları net olmalı.
İşte bu noktada FluentValidation, okunabilir API’leri ve güçlü kural tanımlarıyla hayat kurtarır.

fluentvalidation-akis-diyagrami

1.FluentValidation Kurulumu ve Entegrasyonu

NuGet Paketi

dotnet add package FluentValidation.AspNetCore

Hizmet Kaydı (Program.cs)

builder.Services
    .AddControllers()
    .AddFluentValidation(cfg =>
    {
        cfg.RegisterValidatorsFromAssemblyContaining<Program>();
        cfg.DisableDataAnnotationsValidation = true;
    });

2.Temel Kavramlar (DTO, Validator)

DTO (Data Transfer Object)

public class CreateUserDto
{
    public string FullName { get; set; }
    public string Email    { get; set; }
    public int Age         { get; set; }
}

AbstractValidator<T>

public class CreateUserDtoValidator 
    : AbstractValidator<CreateUserDto>
{
    public CreateUserDtoValidator()
    {
        RuleFor(x => x.FullName)
            .NotEmpty().WithMessage("Ad soyad boş olamaz.")
            .Length(3, 100);

        RuleFor(x => x.Email)
            .NotEmpty()
            .EmailAddress();

        RuleFor(x => x.Age)
            .InclusiveBetween(18, 99)
            .WithMessage("Yaş 18–99 arasında olmalı.");
    }
}

3.Katmanlı Mimari Entegrasyonu

Katman Yapılandırma
API Layer AddFluentValidation kayıt, Controller’da ModelState
Application Layer DTO validator’leri (AbstractValidator)
Domain Layer Domain nesneleri, validasyon genellikle burada değil
[HttpPost]
public IActionResult Create([FromBody] CreateUserDto dto)
{
    if (!ModelState.IsValid)
        return BadRequest(ModelState);

    // İş mantığı...
}

4. Avantajlar & Dezavantajlar

Avantajlar

  • Fluent API: Zincirlenebilir ve okunabilir
  • Modüler Validator’ler: Her DTO’ya özel sınıf
  • Conditional Kurallar: .When().Unless()
  • Child Collection: RuleForEach()

Dezavantajlar

  • Başlangıç Maliyeti: Paket, DI ayarları
  • Performans Yükü: Çok karmaşık validator’lerde
  • Localizasyon: Mesajlar için ekstra konfigürasyon

5.İleri Senaryolar

Conditional Kurallar

RuleFor(x => x.Discount)
    .GreaterThan(0).When(x => x.IsPremiumUser);

Child Collection

public class OrderDto { public List<OrderItemDto> Items { get; set; } }

public class OrderDtoValidator : AbstractValidator<OrderDto>
{
    public OrderDtoValidator() =>
        RuleForEach(x => x.Items).SetValidator(new OrderItemDtoValidator());
}

fluentvalidation-katmanli-mimari-semasi

6.Gerçek Projelerde Dikkat Edilmesi Gerekenler

  • Global Exception Filter ile tutarlı hata formatı
  • AssertConfigurationIsValid() ile validator’ları test et
  • Performans: Sadece ihtiyaç duyulan validator’leri kaydedin
  • Localization: Mesajları .WithName() ile yerelleştirin

Dahili Bağlantılar

  • Validasyon sonrası Result Pattern ile tutarlı dönüş sağlayın.
  • AutoMapper ile DTO dönüşümlerini otomatikleştirin.

7.İleri Okuma ve Kaynaklar

8.Sonuç

  1. FluentValidation ile temel kurallar
  2. Conditional ve child collection senaryoları
  3. Katmanlı mimaride temiz entegrasyon

Bu rehberle hem basit hem de ileri validasyon senaryolarını güvenle uygulayabilirsiniz.

By tanju.bozok

Software Architect, Developer, and Entrepreneur

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir