Fluent Validations e ASP.NET Core: Criando um Filter de validação da entrada de sua API

Olá, galera! Tudo bem por aí?

Com o objetivo de agregar de maneira simples e rápida em seus projetos, surgiu a ideia deste artigo decorrente de um Filter que criei para um dos projetos em que trabalhei. 

Vou apresentar sobre a biblioteca Fluent Validations e mostrar um pouco de sua capacidade. Após isso, mostrarei como utilizá-la criando um Filter para deixar a validação dos dados de entrada de APIs bem elegante, sem necessitar ficar adicionando checagens do ModelState no início de cada Action da sua API.

Código-fonte para o exemplo completo aqui.

Vamos lá?

Sobre o Fluent Validations

O Fluent Validations, com repositório do github aqui, é uma biblioteca utilizada para realizar validações de objetos, com regras estabelecidas pelo desenvolvedor. Com isso, é possível criar validação para diversos cenários, sendo o que eu vou explorar aqui é o de validação de entrada de APIs.

Como instalar via Visual Studio

Busque por FluentValidation.AspNetCore no Gerenciador de Pacotes do NuGet e instale a versão mais recente.

Instalando o pacote FluentValidation.AspNetCore via Nuget Package Manager

Como instalar via Visual Studio Code / terminal

Para instalar utilizando o terminal de comando, basta executar o comando abaixo na pasta raiz do projeto.

Instalando o pacote FluentValidation.AspNetCore via linha de comando

Como funciona

Para criar um validador, crie uma classe que herde de AbstractValidator (namespace FluentValidation), e passe a classe que deseje realizar a validação como parâmetro genérico.

Dentro do seu construtor, definimos as regras de validação. A sintaxe é bem semelhante a checagens em frameworks de testes unitários.

O método RuleFor recebe uma expressão como parâmetro Expression<Func<T, TProperty>>, em que T é sua classe e TProperty é uma expressão, na qual geralmente queremos incluir ou a propriedade ou utilizar algum método para validar essa propriedade de maneira mais complexa.

Criando uma regra usando FluentValidation

Dentre os métodos mais utilizados para validação, destaco:

  • NotNull;
  • NotEmpty;
  • GreaterThan, GreaterThanOrEqual, LessThan, LessThanOrEqual;
  • Equal, NotEqual.

Mais sobre a biblioteca pode ser encontrado em seu site.

Implementando um filter de validação para sua API

Criando sua classe de validação

Recomendo criar a classe de validação em uma pasta própria, na camada de “Aplicação”, para manter as responsabilidades bem organizadas.

Implementação de regras para CriarPedidoInputModel

 No projeto do Github eu crio mais duas classes de validação, para cada um dos objetos de dependência ProdutoInputModel e CupomInputModel.

Criando o Filter

Para criar um filtro, basta criar uma classe que implemente IActionFilter e implementar seus métódos. Queremos implementar o método OnActionExecuting porque necessitamos executar a validação ANTES da ação ser executada em nosso método do Controller.

Implementando um filtro usando as regras definidas com o FluentValidation

Para os que tenham interesse sobre essa classe ErrosViewModel, deixo aqui a implementação. É bem simples.

Implementação do ErrosViewModel

Adicionando o Fluent Validations e Filter ao Startup.cs

Adicionamos as funcionalidades dos validadores utilizando o método de extensão AddFluentValidation junto à chamada do AddMvc, em ConfigureServices. Passa-se nessa chamada o Assembly onde estará as classes de validação. Se suas classes de validação estiverem em outro projeto, coloquem aqui uma Classe que esteja nele (uma das próprias classes validadoras já resolve isso).

Para adicionarmos o filter, basta inseri-lo na lista de Filters do MvcOptions.

Adicionando o ModelStateValidatorFilter e FluentValidation na aplicação

Testando

Executamos a aplicação e fazemos uma chamada HTTP POST à API, enviando o objeto a ser validado no corpo da requisição.

Com o código utilizado, recebemos uma lista de mensagens de erros.

Testando a requisição usando Postman

Com isso, o front-end consegue iterar entre os erros e apresentar uma mensagem clara ao usuário.


Inscreva-se na lista de espera do Método .NET Direto ao Ponto, um treinamento completo sobre C#, APIs com ASP.NET Core e Microsserviços:  Inscreva-se aqui.

São quase 200 vídeo-aulas sobre temas como C#, ASP NET Core 5, EF Core, CQRS, Clean Architecture, Autenticação e autorização com JWT, Testes Unitários, além de mini-cursos em Microsserviços, Performance em .NET, ASP NET Core e Azure, Docker, Carreira Internacional em .NET, e mais.

Conclusão

Espero que com a leitura desse artigo, e com o código-fonte disponibilizado, dê para implementar ou pelo menos criar uma prova de conceito em projetos de sua empresa, e agregar assim com a qualidade de código e flexibilidade nas validações das APIs.

Até a próxima!

Se achou o artigo interessante, te convido a comentar, e/ou compartilhar!

Se tiver ideias de assuntos e/ou tecnologias que queiram que eu aborde em um artigo futuro, não hesite em entrar em contato!