1. Início
  2. Desenvolvimiento de software
  3. Validação de dados usando Fluent Validation

Validação de dados usando Fluent Validation

imagem com fundo roxo logo da geekhunter e logo do fluent validation

Usando o paradigma da orientação a objetos, deveria ser natural iniciar o desenvolvimento pelo modelo de entidades, onde as classes são definidas para representar o domínio do negócio.

Posteriormente, e a partir destas classes, seria gerado o banco de dados usado pela aplicação para realizar a persistência das informações.

A realidade não é bem assim. Na maioria das vezes vemos bancos de dados já projetados.

O Data Annotation

Para facilitar que as informações sejam inseridas corretamente, o pessoal do desenvolvimento utiliza quase 100% dos atributos Data Annotation — que foram introduzidos no .NET 3.5 como uma forma de adicionar a validação para as classes usadas por aplicações ASP.NET. 

Como tudo na vida tende a evoluir, vamos comparar um pouco o Data Annotation com o FluentValidation, nos baseando na sua facilidade de criar códigos limpos (clean code) mas, principalmente na sua forma de tratamento das validações.

Cenário: Vamos imaginar uma view com diversos campos e, em um dado momento, o usuário submete para o servidor.

O Data Annotation define os requisitos das propriedades e validação das entidades e, caso haja algum erro, retorna o formulário para o usuário.

Até ai, beleza. Só que, a cada submissão, os erros são tratados um a um.

No FluentValidation isso não funciona, é criado um “dicionário de erros”, que só será submetido quando todos erros forem eliminados na view, assim não temos um vai e volta do servidor.

>>Leitura Recomendada:
Usando o MediatR com ASP.NET Core

O que é Fluent Validation?

Fluent Validation é uma biblioteca que veio para criar validações de dados de forma simples e rápida para os desenvolvedores.

Com ela, podemos usar expressões Lambda para “construir regras de validações” com retorno de mensagem de erro para cada propriedade das entidades.

Podemos criar projetos de teste (tenho no meu GitHub um exemplo) em que os retornos são legíveis.

Quando um projeto é 100% criado em Fluent Validation, o pessoal de teste tem muito menos afazeres pois o teste ocorre paralelamente ao desenvolvimento.

>>Leitura Recomendada:
Os 5 melhores frameworks de Python

Instalando Fluent Validation no ASP.NET CORE

Para habilitar a integração MVC, você precisará adicionar uma referência ao:

 FluentValidation.AspNetCoreassembly 

Instalando o pacote NuGet apropriado

 Install-Package FluentValidation.AspNetCore 

Depois de instalado, você precisará configurar o Fluent Validation na classe Startup do seu aplicativo chamando o AddFluentValidation, método de extensão dentro do ConfigureServices, método que requer a using FluentValidation.AspNetCore.

Este método deve ser chamado diretamente após a chamada AddMvc:

 public void ConfigureServices(IServiceCollection services) {
    services.AddMvc(setup => {
      //...mvc setup...
    }).AddFluentValidation();
}

 

Para que o ASP.NET descubra seus validadores, eles devem estar registrados na coleção de serviços.

Você pode fazer isso chamando o AddTransient, método para cada um dos seus validadores…

 public void ConfigureServices(IServiceCollection services) {
    services.AddMvc(setup => {
      //...mvc setup...
    }).AddFluentValidation();
}

 

… Ou usando o AddFromAssemblyContaining, método para registrar automaticamente todos os validadores em uma montagem específica.

Isso encontrará automaticamente quaisquer tipos públicos não abstratos que herdam AbstractValidatore e estão registrados no contêiner (os genéricos abertos não são suportados).

 services.AddMvc()
  .AddFluentValidation(fv => fv.RegisterValidatorsFromAssemblyContaining<PersonValidator>()); 

Este exemplo supõe que o PersonValidator esteja definido para validar uma classe chamada Person:

 public class Person {
 public int Id { get; set; }
 public string Name { get; set; }
 public string Email { get; set; }
 public int Age { get; set; }
}

public class PersonValidator : AbstractValidator<Person> {
 public PersonValidator() {
 RuleFor(x => x.Id).NotNull();
 RuleFor(x => x.Name).Length(0, 10);
 RuleFor(x => x.Email).EmailAddress();
 RuleFor(x => x.Age).InclusiveBetween(18, 60);
 }
}

 

E aqui está a visualização (view) correspondente (usando o Razor):

 @model Person

<div asp-validation-summary="ModelOnly"></div>

<form asp-action="Create">
  Id: <input asp-for="Id" /> <span asp-validation-for="Id"></span>
  <br />
  Name: <input asp-for="Name" /> <span asp-validation-for="Name"></span>
  <br />
  Email: <input asp-for="Email" /> <span asp-validation-for="Email"></span>
  <br />
  Age: <input asp-for="Age" /> <span asp-validation-for="Age"></span>

  <br /><br />
  <input type="submit" value="submtit" />
</form>

 

>>Leitura Recomendada:
Melhores linguagens de programação para devs iniciantes

Compatibilidade com a validação interna do ASP.NET

Por padrão, após a execução do Fluent Validation, qualquer outro provedor de validador também terá a chance de executar.

Isso significa que você pode misturar Fluent Validation com atributos Data Annotations (ou qualquer outra implementação do ASP.NET ModelValidatorProvider).

Se você deseja desativar esse comportamento para que Fluent Validation seja a única biblioteca de validação executada, defina o RunDefaultMvcValidationAfterFluentValidationExecutes como false na rotina de inicialização do aplicativo:

 services.AddMvc().AddFluentValidation(fv => {
 fv.RunDefaultMvcValidationAfterFluentValidationExecutes = false;
});

Validação de propriedade filho implícita vs explícita

Ao validar gráficos de objetos complexos, por padrão, você deve especificar explicitamente quaisquer validadores filhos para propriedades complexas usando SetValidato (consulte a seção de validação de propriedades complexas no Fluent Validation)

Ao executar um aplicativo ASP.NET MVC, você também pode habilitar a validação implícita para propriedades filho.

Quando isso estiver ativado, em vez de precisar especificar validadores filhos usando SetValidator, a infraestrutura de validação do MVC tentará recursivamente encontrar validadores para cada propriedade.

Isso pode ser feito configurando ImplicitlyValidateChildProperties como true.

Observe que, se você habilitar esse comportamento, não deverá usar SetValidator para propriedades filho, ou o validador será executado duas vezes.

Por hoje foi isso, pessoal, espero que tenham gostado do conteúdo sobre Fluent Validation, qualquer dúvida me procurem nas redes sociais ou nos comentários do blog!

>>Leitura Recomendada:
Dicas de Carreira para Programadores .NET

Quer conhecer a plataforma líder em recrutamento tech?

A solução mais completa para recrutar os melhores talentos tech.

Precisa de ajuda para recrutar talentos?

Conheça o Serviço de Recrutamento da Geekhunter

Leituras Recomendadas

Quer receber conteúdos incríveis como esses?

Assine nossa newsletter para ficar por dentro de todas as novidades do universo de TI e carreiras tech.