Fluent Validation é um nuget package utilizado para validações de dados de forma simples e rápida para desenvolvedores .NET, além de contar com a utilização de expressões lambda para construir regras de validações, e com retorno de mensagem de erro padrão para cada propriedade das entidades.
O Fluent Validation trabalha com o conceito de Fail Fast, que quanto mais rápido você falhar, mais rápido você vai saber o que precisa ser corrigido, com isso devemos notificar a operação o mais rápido possível quando um erro ocorrer. Para mais detalhes sobre esse assunto, recomendo a leitura do artigo do Vladimir Khorikov.
Outros benefícios do Fluent Validation são:
- Facilidade na utilização e criação de regras.
- Centralização das regras de negócio.
- Geração de notificação ao invés de erros (exceptions).
- Velocidade de execução (As regras são objetos imutáveis, o que significa que você pode criá-las uma vez e armazená-las em cache).
- Teste de unidade mais eficiente (Regras de validação são muito fáceis de testar).
Mais detalhes você encontra na documentação oficial: https://docs.fluentvalidation.net
Neste artigo, vamos nos concentrar na configuração e construção de regras de validação em uma API em .NET 6.0.
Pré-requisitos
- Visual Studio 2022 (.NET 6.0)
- Nuget package FluentValidation.AspNetCore
API
Na classe program.cs da API, configure conforme o código abaixo:
O método AddFluentValidation() é uma extensão criada para centralizar o padrão de validações e configurações do Fluent Validation, onde:
- RegisterValidatorsFromAssemblyContaining: Registra todas as classes de validações com base no tipo.
- AutomaticValidationEnabled: Habilita ou desabilita a validação automática. Neste exemplo deixaremos desabilitado.
- ValidatorOptions.LanguageManager.Culture: Configura a tradução padrão das mensagens de validação para pt-BR.
O método GetErrors() é utilizado para capturar as mensagens da validação e retornar como um objeto de notificação:
Em seguida, é necessário criar as propriedades do objeto de entrada ClientViewModel e as validações em ClientViewModelValidator, que contém as regras necessárias para registrar um novo cliente:
E por fim, é preciso configurar a chamada da validação em ClientController, onde é necessário registrar a injeção de dependência IValidator e utilizar o método ValidateAsync() para realizar a validação do objeto:
Testando
Para realizar os testes, execute o endpoint POST /client no Swagger e deixe o campo “name” como vazio ou null e clique em Execute:
Como resultado, é exibido um BadRequest informando as mensagens de validações escritas na classe ClientViewModelValidator:
Finalizando
A utilização da biblioteca Fluent Validation é ideal para separar a lógica de validação das classes do modelo. Ele também fornece uma documentação rica e de fácil de integração, além de suportar injeção de dependência para injetar validadores ou outros componentes para ter uma validação completa e centralizada.
Os detalhes completos deste exemplo você encontra no meu GitHub: https://github.com/hgmauri/sample-fluentvalidation