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.

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
- 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());
}

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ç
- FluentValidation ile temel kurallar
- Conditional ve child collection senaryoları
- Katmanlı mimaride temiz entegrasyon
Bu rehberle hem basit hem de ileri validasyon senaryolarını güvenle uygulayabilirsiniz.