C#'de FluentValidation - Güçlü Ama Kolay Veri Doğrulama Aracı
Veri doğrulama, güvenilir yazılım geliştirmenin temel taşlarından biridir ve modern .NET uygulamalarında, bunu ele almanın güçlü, sürdürülebilir ve ölçeklenebilir bir yoluna ihtiyaçınız var. İşte burada, güçlü türde doğrulama kuralları oluşturan popüler bir .NET kütüphanesi olan FluentValidation devreye giriyor.
Tim Corey'nin "Fluent Validation in C# – The Powerful Yet Easy Data Validation Tool" başlıklı ayrıntılı video öğreticisi boyunca, Tim Corey izleyicileri FluentValidation'ı adım adım kullanma sürecinden geçiriyor. Bu makalede, Tim'in yürüyüşünü takip edeceğiz, özelleştirilmiş doğrulayıcılar, zincirleme doğrulayıcılar, ASP.NET entegrasyonu ve .NET Core 3.1 ve .NET Standard 2.0 gibi eski çalışma zamanları için destek gibi ilgili kavramları bütünleştirirken ana noktaları ve kod örneklerini özetleyeceğiz.
Giriş: Neden FluentValidation?
Tim, videoya veri doğrulamanın çoğu zaman tekrarlayıcı ve karmaşık hale geldiğini açıklayarak başlar. Örneğin, benzer doğrulama kurallarını projenin farklı bölümleri arasında kopyalamak ve yapıştırmak DRY (Kendini Tekrarlama) ilkesine aykırıdır. Bunun yerine, Tim, ticari projeler için ideal hale getiren, ücretsiz, güçlü ve sahip olmadığınız modellerde bile çalışan bir .NET doğrulama kütüphanesi olan FluentValidation'ı tanıtıyor.
Tim, öğrendiklerinizi uygulamanın önemini vurgular ve izleyicileri beceri geliştirmek için Haftalık Mücadele serisine yönlendirir.
Demo Uygulaması Genel Bakış
Tim, bir kullanıcının girdilerini yapabildiği bir WinForms demo uygulaması kullanıyor:
Ad
Soyad
Hesap Bakiyesi
- Doğum Tarihi
Bu bir kullanıcı arayüzü demosu olmasına rağmen, doğrulama ilkeleri ASP.NET Core, API testleri ve hatta konsol uygulamaları için aynı derecede iyi uygulanabilir.
Kullanıcı Girdisine Güvenmenin Tehlikesi
Bu noktada, Tim geliştiricilere hatırlatıyor: "Kullanıcıya asla güvenmeyin." Giriş genellikle tahmin edilemez olabilir, örneğin yaş için 10 yerine "on" yazmak gibi. Veritabanına kaydetmeden önce bu girdiyi doğrulamak önemlidir.
Örnek doğrulama kurallarını taslak olarak çizer:
İsim ve soyisim boş olmamalıdır.
Hesap bakiyesi, finansal destek için asgari gereklilik gibi finansal kurallara uymalıdır.
- Doğum tarihi gelecekte olmamalı veya 120 yıldan fazla olmamalıdır.
Doğrulama Mantığı Nereye Gitmeli?
Tim, doğrulayıcıları yapılandırma seçeneklerini araştırıyor:
Kullanıcı Arayüzü formu içinde
Model sınıfında veri açıklamaları kullanarak
- FluentValidation kullanarak ayrı bir doğrulama sınıfında
Veri açıklamalarının sınırlı olduğunu ve genellikle harici kütüphanelerle çalışırken veya daha özel doğrulama mantığı gerektiğinde uygun olmadığını belirtiyor.
FluentValidation'i Yükleme
Tim, Visual Studio kullanarak NuGet aracılığıyla projesine FluentValidation ekler. Sürüm 8.1.0'u yükler ama FluentValidation'ın çok platformlu ve şu sürümlerle uyumlu olduğunu belirtir:
.NET Standard 2.0
.NET Core
ASP.NET
WPF
Xamarin
- Ve daha fazlası
Tim'in ayarları, .NET Core 3.1 ve önceki sürümleri destekleyen FluentValidation 11 dahil, eski çalıştırma zamanları desteğine ihtiyaç duyanlar için de çalışır.
Validator Sınıfı Oluşturma
Tim, güçlü türlendirilmiş doğrulama kuralları oluşturarak yeni bir sınıf oluşturarak gösterir:
public class PersonValidator : AbstractValidator<Person>public class PersonValidator : AbstractValidator<Person>Bu sınıf, Person modelinin tüm doğrulama mantığını içerir. Akıcı arayüz kullanılarak doğrulama kuralları yapıcı içinde tanımlanır.
İlk Doğrulama Kuralı: İlk İsim
Tim, bir lambda ifadesi kullanarak bir kural yazar:
RuleFor(p => p.FirstName).NotEmpty();RuleFor(p => p.FirstName).NotEmpty();Var validator kullanarak Person nesnesini doğrular:
var validator = new PersonValidator();
ValidationResult results = validator.Validate(person);var validator = new PersonValidator();
ValidationResult results = validator.Validate(person);Ardından herhangi bir doğrulama hatası için döngü yaparak bir liste kutusunda kullanıcı dostu mesajlar gösterir.
String Uzunluğu ve Özel Mesajlar
Tim, doğrulama kuralını genişletir:
RuleFor(p => p.FirstName)
.NotEmpty().WithMessage("First name is empty")
.Length(2, 50).WithMessage("Length of first name is invalid");RuleFor(p => p.FirstName)
.NotEmpty().WithMessage("First name is empty")
.Length(2, 50).WithMessage("Length of first name is invalid");Bağlama validator'ları kullanarak, bu kural ismin ne boş ne de çok kısa/uzun olmasını sağlar. Tim, doğrulama ilk hatada durdurmak için Cascade(CascadeMode.Stop)'i tanıtır.
Özel Doğrulama: İsimlerde Geçerli Karakterler
Tim, adında bir yöntem kullanarak özel bir validator uygular:
private bool BeAValidName(string name)private bool BeAValidName(string name)Bu boşlukları ve tireleri çıkarır ve dizginin sadece Unicode harfleri içermesini sağlar, uluslararası karakter desteği sağlar.
Özel kural şu şekilde uygulanır:
.Must(BeAValidName).WithMessage("{PropertyName} contains invalid characters");.Must(BeAValidName).WithMessage("{PropertyName} contains invalid characters");Bu yöntem yapısı, diğer alanlara uyarlamak için idealdir—örneğin özel bir posta kodu doğrulama mantığı fonksiyonu:
private bool BeAValidPostcode(string postcode)
{
// Add custom logic here to specify a valid postcode format
}private bool BeAValidPostcode(string postcode)
{
// Add custom logic here to specify a valid postcode format
}Sonra şunla bir validator içinde kullanabilirsiniz:
RuleFor(c => c.Postcode).Must(BeAValidPostcode)
.WithMessage("Please specify a valid postcode");RuleFor(c => c.Postcode).Must(BeAValidPostcode)
.WithMessage("Please specify a valid postcode");Bu, public class CustomerValidator veya diğer alan spesifik validator'ları gerektiren ticari projelerde yaygındır.
Hata Mesajlarında Yerleşik Değişkenleri Kullanma
Tim, mesajları şu gibi yer tutucularla dinamik olarak nasıl zenginleştireceğini gösterir:
{PropertyName}
{TotalLength}
- {MinLength} ve {MaxLength}
Bu, bağlamsal hata mesajları sonucunu verir:
"Length of First Name is invalid (was 105)""Length of First Name is invalid (was 105)"Bu, kullanıcıların girdi hatalarını düzeltmelerini kolaylaştırır.
Soyadı ve Yerelleştirme
Tim, {PropertyName} ile tekrar kullanılabilir formatlama sayesinde FirstName doğrulama mantığını Soyadı için kopyalar. ASP.NET veya çok dilli desteğe ihtiyaç duyan global uygulamalar için WithLocalizedMessage()'ı da belirtir.
Önemli: CascadeMode Kural Spesifik
Tim, CascadeMode.Stop'un bireysel kurallara uygulandığını, tüm model genelinde küresel olarak değil, açıklar. Eğer hem FirstName hem de LastName boşsa, CascadeMode ayarlı olsa bile her iki kural da tetiklenecektir.
Doğum Tarihi Doğrulaması
Sonraki adımda Tim, doğum tarihinin gerçekçi olmasını sağlamak için bir kural ekler:
private bool BeAValidAge(DateTime dob)
{
var currentYear = DateTime.Now.Year;
var dobYear = dob.Year;
return dobYear <= currentYear && dobYear > (currentYear - 120);
}private bool BeAValidAge(DateTime dob)
{
var currentYear = DateTime.Now.Year;
var dobYear = dob.Year;
return dobYear <= currentYear && dobYear > (currentYear - 120);
}Şu şekilde kullanılır:
RuleFor(p => p.DateOfBirth)
.Must(BeAValidAge)
.WithMessage("Invalid {PropertyName}");RuleFor(p => p.DateOfBirth)
.Must(BeAValidAge)
.WithMessage("Invalid {PropertyName}");Bu, tarih veya son kullanma pencereleri gibi geçici verileri doğrulamak için iyi bir örnektir.
Son Düşünceler ve Öneriler
Tim, FluentValidation'ın ana avantajlarını özetleyerek konuyu toparlar:
Merkezi doğrulama mantığı
Özel validator'lar oluşturmak kolay
Hem .NET 5 ve daha yeni hem de eski çalıştırma zamanları ile uyumlu
Karmaşık modelleri, listeleri ve asenkron kuralları destekler
- Hem hobi amaçlı hem de ticari projeler için ideal
İzleyicileri, iç içe kurallar, e-posta özellik doğrulaması ve daha fazlasını içeren gelişmiş kullanım için FluentValidation belgelerini incelemeye teşvik eder.
Sonuç
FluentValidation, .NET geliştiricilerine yeniden kullanılabilir, ifade gücü yüksek ve sürdürülebilir, güçlü tür bağlı doğrulama kuralları oluşturma olanağı tanır. .NET Core, .NET 8 ile geliştiriyor veya .NET Core 3.1 üzerindeki eski sistemleri sürdürüyor olun, bu kütüphane veri doğrulamayı son derece kolay hale getirir.
Şu özelliklerle birlikte:
Kuralları oluşturma için akıcı arayüz
Özel posta kodu doğrulama mantığı desteği
Visual Studio ile kolay entegrasyon
API testleri, WinForms ve ASP.NET ile uyumlu
- Doğrulama hatalarının sağlam yönetimi
FluentValidation, .NET araç kutunuzda olmazsa olmazdır. Daha fazla ayrıntı için lütfen tam videoyu izleyin ve C# hakkında içgörülü daha fazla video için Tim'in Kanalına abone olun.
İpucu: FluentValidation'ı kullanmaya yeniyseniz, public string Name, string Postcode gibi özellikler için kurallar içeren kendi CustomerValidator'ınızı uygulamayı deneyin. Mock bir API veya UI form ile test edin ve uygulamalı deneyim kazanın.

