Sometimes, there are many validation rules in our methods, such as the employee name cannot be null, the age must be greater than 18, etc., and as usual, we may write some code for defining these rules.
However, this way seems not fluent. Here, I will introduce a small validation library named FluentValidation that uses a fluent interface and lambda expressions for building the validation rules. You can follow this link for more information.
https://fluentvalidation.net/
Step 1 : Creating the validator.
We need to create a class that inherits from AbstractValidator<T>, where T is the type of class that you wish to validate. For the background example, we can create the following validator.
What does this validator do?
The Employee Name property is not empty. If this property is empty, the error message will be "name cannot be null".
The Employee Phone property is not empty. If this property is empty, the error message will be the default value.
The Employee Age property must be greater than 0. If this property is not greater than 0, the error message will be the default value.
Step 2 : Using the validator.
As you can see, we just created an instance of the validator and called the Validatemethod by passing the addEmployee object which we want to validate.
The Validate method returns a ValidationResult object. It contains two properties, one is IsValid that says whether the validation succeeded or not, while the other one is Errors, that contains the details about any validation failures.
The above sample shows you how to get the first error message and all error messages. You can return the message(s) based on your requirement. We only need two steps to use this library.
There are many useful features of Fluent Validation, such as chaining validators.
static void Main(string[] args) { var addEmployee = new AddEmployee(); AddEmployee(addEmployee); Console.ReadKey(); } static void AddEmployee(AddEmployee addEmployee) { if (string.IsNullOrWhiteSpace(addEmployee.EmployeeName)) { Console.WriteLine($"employee name cannot be null"); return; } if (string.IsNullOrWhiteSpace(addEmployee.EmployeePhone)) { Console.WriteLine($"employee phone cannot be null"); return; } if (addEmployee.EmployeeAge <= 0) { Console.WriteLine($"Employee must great than 0"); return; } //code for save values ... }
However, this way seems not fluent. Here, I will introduce a small validation library named FluentValidation that uses a fluent interface and lambda expressions for building the validation rules. You can follow this link for more information.
https://fluentvalidation.net/
Step 1 : Creating the validator.
We need to create a class that inherits from AbstractValidator<T>, where T is the type of class that you wish to validate. For the background example, we can create the following validator.
public class AddEmployeeValidator : AbstractValidator<AddEmployee> { public AddEmployeeValidator() { RuleFor(x => x.EmployeeName).NotEmpty().WithMessage("employee name cannot be null"); RuleFor(x => x.EmplyeePhone).NotEmpty(); RuleFor(x => x.EmployeeAge).GreaterThan(0).WithMessage("age must be great than 0"); } }
What does this validator do?
The Employee Name property is not empty. If this property is empty, the error message will be "name cannot be null".
The Employee Phone property is not empty. If this property is empty, the error message will be the default value.
The Employee Age property must be greater than 0. If this property is not greater than 0, the error message will be the default value.
Step 2 : Using the validator.
static void AddEmployeeWithFluentValidation(AddEmployee addEmployee) { var validator = new AddEmployeeValidator(); var validRes = validator.Validate(addEmployee); if (!validRes.IsValid) { //first error message Console.WriteLine(validRes.Errors.FirstOrDefault()); //Console.WriteLine(validRes.Errors.FirstOrDefault().ErrorMessage); ////all error messages //Console.WriteLine(validRes.ToString(",")); //Console.WriteLine(string.Join(",", validRes.Errors.Select(x => x.ErrorMessage))); //Console.WriteLine(string.Join(",", validRes.Errors)); } //save code ... }
As you can see, we just created an instance of the validator and called the Validatemethod by passing the addEmployee object which we want to validate.
The Validate method returns a ValidationResult object. It contains two properties, one is IsValid that says whether the validation succeeded or not, while the other one is Errors, that contains the details about any validation failures.
The above sample shows you how to get the first error message and all error messages. You can return the message(s) based on your requirement. We only need two steps to use this library.
There are many useful features of Fluent Validation, such as chaining validators.
RuleFor(x => x.EmployeeName) .NotEmpty() .NotEqual("catcher") .WithMessage("employee name cannot be null");
We can combine lots of validators for a property.
Comments
Post a Comment