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ı
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.
June 9, 2017 at 12:29 pm
Güzel bilgiler , teşekkür ederiz