Este projeto apresenta um exemplo de como utilizar o Pipeline Behavior do MediatR e Fluent Validation para criar validações isoladas de comandos (commands) e consultas (queries).
- .NET 9.0;
- Pacotes NuGet:
- FluentValidation.DependencyInjectionExtensions (12.0.0);
- MediatR (13.0.0);
Camada para definição de entidades e classes customizadas para exceções.
Camada específica para definição de regras de negócios, comandos, validações, etc.
Trata-se da API, isto é, ponto de entrada da aplicação.
O ponto de entrada ocorre através da controller UserController
, especificamente no endpoint Create
. Create
recebe requisições
do tipo POST
e espera os seguintes parâmetros no corpo da requisição:
{
"Name": "string"
, "Phone": "string"
}
Após receber uma requisição em Create
na controller UserController
ocorre a chamada do handler do comando CreateUserCommand
.
O handler responsável é o CreateUserCommandHandler
. Ao ser invocado, inicia-se a execução do Pipeline Behavior
. Primeiramente
ocorre a execução do pré-processamento, que no contexto deste projeto consiste em validar os atributos de CreateUserCommand
.
A validação do comando foi implementada na classe CreateUserCommandValidator
. A configuração do pipeline da validação pode ser
encontrada na classe ValidationBehavior
.
O pré-processamento consiste na validação do comando CreateUserCommand
, onde é verificado se os atributos Name
e Phone
foram
informados. Se os atributos estiverem corretos, o fluxo segue para a execução do manipulador CreateUserCommandHandler
.
Após a validação, inicia-se a execução da lógica implementada no manipulador CreateUserCommandHandler
. No caso, a lógica deste manipulador
está simplificada neste projeto, visto que o intuito é apenas exemplificar o comportamento do Pipeline Behavior
.
Após concluir a execução da lógica do manipulador, inicia-se o pós-processamento, onde neste projeto foi adicionado um log para informar que a execução do manipulador ocorreu com sucesso.
Na prática, podemos imaginar e utilizar o Pipeline Behavior
da seguinte maneira:
Foi implementado o método UseValidationExceptionHandler
(método de extensão de IApplicationBuilder
), que captura todas as exceções lançadas pela aplicação.
Dessa forma, é possível tratar tanto erros de validação quanto erros inesperados, garantindo que seja retornado ao solicitante o status code adequado e uma mensagem mais clara sobre o erro.