FluentValidation İle List Validation Kullanımı

Merhaba arkadaşlar, bu yazımızda C#’ ta .Net Framework ve Core uygulamalarında sıklıkla kullandığımız paket olan FluentValidation’ da liste parametre göndererek liste üzerinde validation işlemi gerçekleştireceğiz. Console üzerinde yapacağamız demonun Github linkini yazının sonunda paylaşıyor olacağım.

Her zaman tek satırlık kullanıcı bilgisi ile çalışmayız. Bazen exceldeki bir liste veya bir servisten gelen json sonucu bir listeye doldurarak bu liste üzerinde işlem yapmamız gerekir. Tabi liste olunca validasyon işlemi farklılık gösterir. Akla ilk olarak for ve if kullanarak bu işlemi yapmak gelse de FluentValidation ile bu işlemi daha pratik bir şekilde gerçekleştirebiliriz. Senaryomuz bir öğrenci listesinde ad, soyad, yaş, cinsiyet, mail ve telefon numaraları bilgilerinin olduğu bir liste üzerinde validasyon işlemi yapmak ve hatalı satırlardaki bilgileri satır numaraları ile birlikte ekrana yazmak olacak. Dilerseniz başlayalım.

1.FluentValidation paketinin kurulması

Nuget üzerinden FluentValidation paketi kurulur.

2.Klasörlerin Oluşturulması

Model ve Validator adında projenin kök dizininde 2 tane klasör oluştururuz.

3.Modellerin Oluşturulması

StudentInformationModel adında bir class oluştururuz. Bu model bizim öğrenci bilgilerini karşılayan classımız olacak.

public class StudentInformationModel
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }
    public string Gender { get; set; }
    public string Email { get; set; }
    public string PhoneNumber { get; set; }
}


Sonrasında validatorımız bizden parametreyi tek satır olarak isteyeceği için öğrenci listemizin bulunacağı bir class oluşturmamız gerekiyor. Bu classın adı StudentInformationCollectionModel olacak.

public class StudentInformationCollectionModel
{
    public List<StudentInformationModel> StudentInformationList { get; set; }
}

4.Validator classlarının oluşturulması

Liste üzerinde validasyonun çalışma mantığı şu şekildedir. Listenin bulunduğu class ilgili validasyon classına parametre olarak gönderilir. Sonrasında bu listemizin aslında her bir satırı aynı tipte olduğu için bu satırlar ortak bir validasyon işleminde geçer. Bu yüzden 2 farklı validasyon classı oluştururuz. Bunlardan birincisi satır satır yani tekil olarak bakılacak validasyon işleminin olduğu class. Bu classın adı StudentValidator.
Bu validatorda listenin her satırına teker teker bakılır. Kurallarımız aşağıdaki gibidir.

  • Ad alanı en az 3 karakterden oluşmalıdır. Boş geçilemez ve sadece harf içermek zorundadır.
  • Soyad alanı en az 2 karakterden oluşmalıdır. Boş geçilemez ve sadece harf içermek zorundadır.
  • Mail adresi mail formatında girilmelidir.
  • Yaş alanı 39′ dan büyük 42’den küçük olmak zorundadır.
  • Cinsiyet alanı Erkek veya Kadın tiplerinden bir tanesi olmak zorundadır.
  • Telefon numarası formatı XXXXXXXXXX olarak 10 haneli girilmek zorundadır.

Ayrıca sadece harf ve telefon numarası için IsLetter ve IsPhoneNumber adında 2 metod oluşturulur. Bunun yanında regx işleminde Türkçe karakter problemi olacağı için TurkishCharacterReplace adında metod oluşturulur. Dilerseniz regx işlemi üzerinde türkçe karakter ekleyerek işlemi çözerekte işleme devam edebilir TurkishChracterReplace metodunu oluşturmazsınız.

public class StudentValidator : AbstractValidator<StudentInformationModel>
    {
        public StudentValidator()
        {
            RuleFor(x => TurkishCharacterReplace(x.Name)).Must(IsLetter).WithMessage("Ad alanı sadece harf içermek zorundadır");
            RuleFor(x => x.Name).NotEmpty().WithMessage("Ad alanı boş geçilemez").MinimumLength(3).WithMessage("Ad alanı 3 karakterden kısa olamaz");
            RuleFor(x => TurkishCharacterReplace(x.Surname)).Must(IsLetter).WithMessage("Soyad alanı sadece harf içermek zorundadır");
            RuleFor(x => x.Surname).NotEmpty().WithMessage("Soyad alanı boş geçilemez").MinimumLength(2).WithMessage("Soyad alanı 2 karakterden kısa olamaz");
            RuleFor(x => x.Email).EmailAddress().WithMessage("Mail adresini doğru formatta giriniz.");
            RuleFor(x => x.Age).LessThan(42).WithMessage("Öğrenci yaşı  42' den küçük olmak zorundadır").GreaterThan(39).WithMessage("Öğrenci yaşı 39'dan büyük olmak zorundadır");
            RuleFor(x => x.Gender).Must(x => x.Equals("Kadın") || x.Equals("Erkek")).WithMessage("Cinsiyet Erkek veya Kadın olmak zorundadır");
            RuleFor(x => x.PhoneNumber).Must(IsPhoneNumber).WithMessage("Telefon numarası formatı yanlış girildi.");
        }

        private bool IsLetter(string arg)
        {
            Regex regex = new Regex(@"^[a-zA-Z]+$");
            return regex.IsMatch(arg);
        }
        private bool IsPhoneNumber(string arg)
        {
            Regex regex = new Regex(@"^[0-9]{10}$");
            return regex.IsMatch(arg);
        }

        private string TurkishCharacterReplace(string metin)
        {
            metin = metin.Replace("ı", "i");
            metin = metin.Replace("ö", "o");
            metin = metin.Replace("ü", "u");
            metin = metin.Replace("ğ", "g");
            metin = metin.Replace("ç", "c");
            metin = metin.Replace("ş", "s");
            metin = metin.Replace("Ü", "U");
            metin = metin.Replace("İ", "I");
            metin = metin.Replace("Ö", "O");
            metin = metin.Replace("Ğ", "G");
            metin = metin.Replace("Ç", "C");
            metin = metin.Replace("Ş", "S");
            metin = metin.Replace(" ", "");
            return metin;
        }
    }

Sonrasında listemizi parametre göndereceğimiz StudentListValidator adında Validator classını oluşturuyoruz. Burada dikkat ettiyseniz bu validator classına listemiz geliyor gelen listeyi aynı şekilde StudentValidator classına gönderiyoruz.

public class StudentListValidator:AbstractValidator<StudentInformationCollectionModel>
{
    public StudentListValidator()
    {
        RuleForEach(x => x.StudentInformationList).SetValidator(new StudentValidator());
    }
}

5.Program classındaki işlemler

GetStudentLessonList adında öğrenci listesini dolduracağımız metod oluşturulur.

    private static List<StudentInformationModel> GetStudentLessonList()
    {
        List<StudentInformationModel> list = new List<StudentInformationModel>();

        list.Add(new StudentInformationModel { Name = "Mehmet Akif", Surname = "Vuruc1u", Age = 40, Gender = "Erkek", Email = "mehmetakif@gmail.com", PhoneNumber = "5553332211" });
        list.Add(new StudentInformationModel { Name = "Hasan", Surname = "Mutlu", Age = 45, Gender = "Erkek", Email = "hasan", PhoneNumber = "5332223366" });
        list.Add(new StudentInformationModel { Name = "", Surname = "Dogan", Age = 40, Gender = "Kadın", Email = "cansu@com", PhoneNumber = "5442221100" });
        list.Add(new StudentInformationModel { Name = "Ziya", Surname = "Kaya", Age = 40, Gender = "Erkek", Email = "ziya@gmail.com", PhoneNumber = "5351111111" });
        list.Add(new StudentInformationModel { Name = "Müge", Surname = "Güneş", Age = 41, Gender = "Kadın", Email = "muge@gmail.com", PhoneNumber = "05432223311" });

        return list;
    }

Son olarak Main metodu içerisinde listemizi validator classımıza göndereceğimiz ve sonucu ekrana yazdıracağımız işlemi yapıyoruz.

StudentListValidator validations = new StudentListValidator();
            var model = new StudentInformationCollectionModel { StudentInformationList = GetStudentLessonList() };
            ValidationResult result = validations.Validate(model);
            if (!result.IsValid)
            {
                foreach (var item in result.Errors)
                {
                    item.FormattedMessagePlaceholderValues.TryGetValue("CollectionIndex", out object index);
                    Console.WriteLine((int)index + 1 + ". satırdaki " + item.ErrorMessage);
                }
            }
            Console.ReadLine();

Uygulamamızı çalıştırınca aşağıdaki sonucu elde ediyor olacağız.

Bu yazınında böylece sonuna geldik. Bir sonraki yazıda görüşmek üzere…

Github Linki

https://github.com/MehmetAkifVurucu/ConsoleFluentValidationListValidate

Related Post

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir