.NET Fluent Validation ( Model Kontrolü )

Bu makalede .NET için ek bir Nuget paket halinde bulunan Model kontrol için geliştirilmiş fluent interface ve lambda expression desteği olan güzel bir eklentiden bahsetmek istiyorum. Daha önce MVC yada herhangi benzeri Model Driven Architecture (MDA) prensibiyle uygulama geliştirdiyseniz bu mimarilerde Model’lar için validation ASP.NET core’u içerisinde yer alan Data Annotions  ile yapılabilmekte. Fakat bu yöntem ile validation yapıldığı zaman model sayısı arttığında daha karmaşık ve yönetimi zor bir yapı oluşmakta. Bunun yerine validation katmanını business layer’a taşıyıp tek bir yerden kontrolün yapılması ve model domain’in temiz kalması daha kontrol edilebilir bir yapı sağlamakta.

Data Annotions kullanmamaktan bahsetmiyorum, tercih meselesi. Eğer separation of concern prensibi çerçevesinde değerlendirecek olursak Domain katmanını temiz bırakıp validation’ı ayrı bir katmanda kontrol etmek daha doğru olur.Amacım programlama konsepti tartışmaktan çok paket ile örnek uygulama yapmaktı merak etmeyin çok fazla uzatmadan hemen örneğe geçiyorum.

Fluent Api Validation yüklemek için Nuget Console’a

Install-Package FluentValidation

yazarak yükleyebilirsiniz.

Örnek ( Example)

    public class Company
    {
        public string CompanyName { get; set; }
        public string EMail { get; set; }
        public string Phone { get; set; }
        public double AnnualIncome { get; set; }
        public string Address { get; set; }
        public List<Employee> Employees { get; set; }
    }

    public class Employee
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public string Gender { get; set; }
    }

 

 public class CompanyValidation : AbstractValidator<Company>
    {
        public CompanyValidation()
        {
            RuleFor(a => a.CompanyName).NotEmpty().Length(0, 8).WithMessage("You exceeded the maximum char limit");
                //Hatayı test etmek için küçük değer kullanıyorum
            RuleFor(a => a.Address).NotEmpty().Length(0, 250);
            RuleFor(a => a.EMail).EmailAddress().WithMessage("Invalid EMail");
            RuleFor(a => a.AnnualIncome).GreaterThan(0).LessThanOrEqualTo(5000000);
            RuleFor(a => a.Employees).SetCollectionValidator(new EmployeeValidation());
            //Collection için normal validation bile kullanabiliyorsunuz
        } 
    }

    public class EmployeeValidation : AbstractValidator<Employee>
    {
        public EmployeeValidation()
        {
            RuleFor(e => e.Age).GreaterThan(18).LessThanOrEqualTo(150);
            RuleFor(e => e.Name).NotEmpty();
        }
    }
        static void Main(string[] args)
        {
            var companyValidator = new CompanyValidation();
            var company = new Company();
            company.Employees= new List<Employee>();
           
            company.Employees.Add(new Employee());
            company.Employees.Add(new Employee() {Age = 255,Name = "Ali",Gender = "Male"});
            var validation = companyValidator.Validate(company);
            var errors = validation.Errors;
            var state = validation.IsValid;
            Console.WriteLine(state);
            foreach (var error in errors)
            {
                Console.WriteLine(error.PropertyName +"-"+ error);
            }
            Console.WriteLine("-----------------");
            Console.ReadLine();

        }

Program Çıktısı

validationresult

Gördüğünüz gibi model sınıflarımızı temiz bırakarak ( POCO  sınıflar ) validation sağladık.

Validation için detaylı bilgi için tıklayınız

 

Başka bir makalede görüşmek üzere. Hoşçakalın.

1 Comment

  1. Güzel bilgiler , teşekkür ederiz

Leave a Reply

Your email address will not be published.