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.


Quer alavancar sua carreira como Desenvolvedor(a) .NET?

Opa, aqui é o Luis Felipe (LuisDev), criador do blog LuisDev.

Além de Desenvolvedor .NET Sênior, eu sou instrutor de mais de 700 alunos e também tenho dezenas de mentorados.

Conheça o com mais de 800 video-aulas sobre C# e desenvolvimento de APIs com ASP NET Core, Microsserviços com ASP NET Core, Arquitetura de Software, Computação em Nuvem, SQL, HTML, CSS e JavaScript, JavaScript Intermediário, TypeScript, Desenvolvimento Front-End com Angular, e Desenvolvimento Front-end com React. Diversos mini-cursos disponíveis aos alunos e atualizações gratuitas.

Suporte dedicado, e comunidade de centenas de alunos.

Completo e online, destinado a profissionais que querem dar seu próximo passo em sua carreira como desenvolvedores .NET.

Clique aqui para ter mais informações e garantir sua vaga


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!