Validação dos dados com Fluent Validation

dotnet 8 de Fev de 2022

Quando estamos desenvolvendo aplicações geralmente precisamos criar validações nos dados recebidos. Acredito que essa deva ser a primeira etapa antes de qualquer processamento, ou seja, sempre que recebemos os dados devemos primeiro validar para depois passar para os processos  envolvam regras de negócios.

Problema

Geralmente quando não temos um local definido para validações,  isso acaba ficando espalhado dentro das classes de regra de negócio.  Dessa forma temos processamento desnecessário, ou seja ao invés de fazermos a validação prévia de tudo, acabamos colocando uma validação no meio de algum processo.

Solução

Uma das maneiras de facilitar essa validação seria utilizar o Fluent Validation que nos traz diversos meios de validação prontos para uso.

Primeiro vamos criar um projeto console novo e adicionar o pacote do Fluent Validation nele com o seguinte comando:

dotnet new console -n FluentValidationDemo
dotnet add FluentValidationDemo package FluentValidation

Dentro do projeto que acabamos de criar vamos adicionar uma classe que iremos validar

public class Empresa{
    public string? RazaoSocial {get; set;}
    public string? Cnpj {get; set;}
    public string? Email {get; set;}
    public string? Telefone {get; set;}
    public bool LiberadoCompra {get; set;}
    public string? Motivo {get; set;}
}

Nessa classe empresa temos algumas propriedades que precisam seguir as seguintes regras de preenchimento:

  • Razão Social: preenchimento obrigatório e ter no mínimo 5 caracteres.
  • CNPJ: preenchimento obrigatório e ter exatamente 14 caracteres.
  • Email: preenchimento obrigatório e ser um endereço eletrônico válido.
  • Telefone: preenchimento obrigatório.
  • Regra: quando LiberadoCompra for verdadeiro, o campo motivo deverá ser preenchido com no mínimo 15 caracteres.

A biblioteca do Fluent Validator disponibiliza uma classe abstrata chamada AbstractValidator que recebe um tipo como parâmetro, dessa forma criamos o validador da classe empresa da seguinte maneira.

using FluentValidation;

                                //Tipo Empresa como parametro do validator
public class EmpresaValidacao : AbstractValidator<Empresa>
{
    public EmpresaValidacao(){
        RuleFor(empresa => empresa.RazaoSocial).NotEmpty().MinimumLength(5);
        RuleFor(empresa => empresa.Cnpj).NotEmpty().Length(14);
        RuleFor(empresa => empresa.Email).NotEmpty().EmailAddress();
        RuleFor(empresa => empresa.Telefone).NotEmpty();

        When(empresa => empresa.LiberadoCompra,  
        //Action criada como segundo parametro
        //irá ser executada somente se o campo LiberadoCompra for verdadeiro
        () => 
        {
            RuleFor(empresa => empresa.Motivo).NotEmpty().MinimumLength(15);
            
        });
    }
}

Dentro do construtor do validador definimos todas as regras que listamos acima, utilizamos o RuleFor para selecionar a propriedade que vamos aplicar a validação e na sequência definimos que tipo de regra vamos aplicar nela.

Quando necessitamos de uma validação condicional, ou seja validar uma propriedade somente quando uma condição for atingida, utilizamos When. O primeiro parâmetro dele é a expressão que irá ativar ou não a condição. No nosso caso, se a propriedade LiberadoCompra for verdadeiro, então ele avança para a execução da action que passamos como segundo parâmetro.

Dessa forma, a propriedade Motivo só será validada caso LiberadoCompra for verdadeiro.

Agora que finalizamos todo o código base podemos criar no nosso console um simples código para executar a validação.

Dentro do arquivo Program.cs adicione o seguinte código:

public class Program{
    public static void Main(string[] args)
    {
        var empresa = new Empresa{
            RazaoSocial =  "Empresa dos Sonhos LTDA",
            Cnpj = "01234567890123",
            Email = "teste@teste.com",
            LiberadoCompra = false,
            Telefone = "1223134",
            Motivo = ""
        };

        ValidarEmpresa(empresa);

    }

    public static  void ValidarEmpresa(Empresa empresa){
        var validator = new EmpresaValidacao();

        var validacaoResultado = validator.Validate(empresa);

        if(validacaoResultado.IsValid){
            Console.WriteLine("Empresa válida");
            return;
        }

        Console.WriteLine("Empresa inválida");
        Console.WriteLine("Erros");
        foreach(var erro in validacaoResultado.Errors){
            Console.WriteLine($"{erro.ErrorCode} {erro.ErrorMessage}");
        }

        return;
    }
}

Nesse código definimos um método chamado ValidarEmpresa que basicamente cria uma instância do EmpresaValidacao e executa o método Validate dele. Após isso verifica o resultado da validação e, caso negativo, imprime na tela os erros de validação.

Para executar o código basta digitar o seguinte comando no terminal.

dotnet run --project .\FluentValidationDemo\

Desta forma, irá retornar Empresa Válida no console. Agora vamos alterar um pouco os dados da empresa no Program.cs deixando alguma propriedade inválida

Por exemplo, alterando RazaoSocial para em branco

var empresa = new Empresa{
            RazaoSocial =  "",
            Cnpj = "01234567890123",
            Email = "teste@teste.com",
            LiberadoCompra = false,
            Telefone = "1223134",
            Motivo = ""
        };

Quando executarmos novamente o programa teremos o seguinte retorno:

Empresa inválida
Erros
NotEmptyValidator 'Razao Social' deve ser informado.
MinimumLengthValidator 'Razao Social' deve ser maior ou igual a 5 caracteres. Você digitou 0 caracteres.

Como esperado,  retornou os seguintes erros: O Razão Social deve ser preenchido e deve ter no mínimo 5 caracteres.

Agora vamos mudar novamente e deixar empresa com os seguintes dados:

var empresa = new Empresa{
            RazaoSocial =  "Empresa dos Sonhos LTDA",
            Cnpj = "01234567890123",
            Email = "teste@teste.com",
            LiberadoCompra = true,
            Telefone = "1223134",
            Motivo = ""
        };

Quando executarmos novamente, teremos o seguinte retorno.

Empresa inválida
Erros
NotEmptyValidator 'Motivo' deve ser informado.
MinimumLengthValidator 'Motivo' deve ser maior ou igual a 15 caracteres. Você digitou 0 caracteres.

Neste caso fez a validação condicional corretamente, pois o campo LiberadoCompra está como verdadeiro e o Motivo não está preenchido.

Conclusão

Como percebemos o Fluent Validation deixa muito mais simples a tarefa de validação, pois disponibiliza uma quantidade grande de possibilidades e facilidades, tornando essa tarefa trivial.

Great! You've successfully subscribed.
Great! Next, complete checkout for full access.
Welcome back! You've successfully signed in.
Success! Your account is fully activated, you now have access to all content.