Skip to main content

How To Use Fluent Validation In .NET Core.

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.
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

Popular posts from this blog

How To See Logs Of Dropped Tables From The Database in MS SQL.

Here, I will explain you how you can see logs of users. Step 1 : First, create a new database with name "test". Step 2 : Create a new table. Step 3 : Now, go and drop the table by running the following command. Step 4 : Now, select your database under Object Explorer and go to Reports >> Standard Reports >> Schema Changes History. Step 5 : You will then see the schema change history. The report will show you who has dropped this table. Finally, you can locate the user activity with the help of log.

How To Implement NLog With WebAPI In Asp.Net(C#).

What is NLog? NLog is a flexible and free logging platform for various .NET platforms, including .NET standard. NLog is easy to apply and it includes several targets (database, file, event viewer). Which platform support it? .NET Framework 3.5, 4, 4.5, 4.6 & 4.7 .NET Framework 4 client profile Xamarin Android Xamarin iOS Windows Phone 8 Silver light 4 and 5 Mono 4 ASP.NET 4 (NLog.Web package) ASP.NET Core (NLog.Web.AspNetCore package) .NET Core (NLog.Extensions.Logging package) .NET Standard 1.x - NLog 4.5 .NET Standard 2.x - NLog 4.5 UWP - NLog 4.5 There are several log levels. Fatal : Something terrible occurred; the application is going down  Error : Something fizzled; the application might possibly proceed Warn : Something surprising; the application will proceed  Info : Normal conduct like mail sent, client refreshed profile and so on.  Debug : For troubleshooting; the executed question, the client confirmed, ...

How to write Unit Tests in .net

Unit tests are automated tests that verify the behavior code like methods and functions. Writing unit tests is crucial to clean coding, as they help ensure your code works as intended and catches bugs early in the development process. I can share some tips for writing effective unit tests: Write tests for all public methods Every public method in your code should have a corresponding unit test. This helps ensure that your code behaves correctly and catches any unexpected behavior early. public class Calculator { public int Add(int a, int b) { return a + b; } } [TestClass] public class CalculatorTests { [TestMethod] public void Add_ShouldReturnCorrectSum() { // Arrange Calculator calculator = new Calculator(); int a = 1; int b = 2; // Act int result = calculator.Add(a, b); // Assert Assert.AreEqual(3, result); } } Test boundary conditions  Make sure to test boundary conditions, such a...