Validação IA

Fundamentos: Clean Architecture com Mediator

Descrição: Implementação prática de Clean Architecture utilizando MediatR, mostrando como integrar o padrão Mediator em aplicações .NET com CQRS.


📦 Passo 1: Instalando o MediatR

1.1 Instalação no projeto Application

# Navegar até o projeto Application
cd Aviator.Application

# Instalar o pacote MediatR via dotnet CLI
dotnet add package MediatR

# Ou via Package Manager Console
Install-Package MediatR

Versão recomendada: MediatR 12.x (mais recente estável)

1.2 O que o MediatR traz?

  • Padrão Mediator implementado

  • Desacoplamento completo entre emissores e handlers

  • Pipeline behaviors para cross-cutting concerns

  • Pub/Sub para eventos

  • Descoberta automática de handlers


🔄 Passo 2: Refatorando o Caso de Uso Create

2.1 Refatorando o Response

ANTES (sem Mediator):

DEPOIS (com Mediator):

2.2 Refatorando o Command

ANTES (sem Mediator):

DEPOIS (com Mediator):

2.3 Refatorando o Handler

ANTES (sem Mediator):

DEPOIS (com Mediator):


🏗️ Passo 3: Configurando a Injeção de Dependência

3.1 Criando a classe de configuração

Local: Aviator.Application/DependencyInjection.cs

3.2 Como o MediatR encontra os handlers?

O MediatR usa reflection para:

  1. Listar todos os tipos no Assembly

  2. Filtrar os que implementam IRequestHandler<TRequest, TResponse>

  3. Extrair o TRequest (Command/Query) de cada handler

  4. Criar um dicionário interno: CommandType → HandlerType

Exemplo do mapeamento interno:


🌐 Passo 4: Refatorando a API

4.1 Refatorando o Program.cs

ANTES (sem Mediator):

DEPOIS (com Mediator):

4.2 Explicando ISender e o fluxo:

Vantagem: Se amanhã mudarmos o Handler, o Endpoint não precisa ser alterado.


🧪 Passo 5: Testando a Implementação

5.1 Executando a aplicação:

5.2 Testando com Postman:

Requisição POST:

Resposta esperada:

5.3 Verificando o que foi registrado:


🔍 Passo 6: Entendendo o Funcionamento Interno

6.1 Como o MediatR resolve qual handler usar?

6.2 Mapeamento Automático vs Manual:

Com MediatR (Automático):

Sem MediatR (Manual):


⚖️ Análise Crítica: Vale a Pena Usar Mediator?

Quando VALE A PENA usar MediatR:

1. Pipeline Behaviors (Middleware)

2. Validação Centralizada

3. Eventos (Pub/Sub)

Quando NÃO VALE A PENA usar MediatR:

1. Projetos muito simples

2. Performance crítica extrema

3. Dependências explícitas são obrigatórias


📊 Comparação Detalhada

Aspecto
Sem Mediator
Com Mediator (MediatR)

Acoplamento

Alto (Endpoint→Handler)

Baixo (Endpoint→ISender)

Registro

Manual por handler

Automático por assembly

Cross-cutting

Em cada handler

Pipeline behaviors

Performance

Máxima

Pequeno overhead

Complexidade

Baixa

Média

Flexibilidade

Baixa

Alta

Testabilidade

Igual

Igual

Manutenção

Mais trabalho

Menos trabalho


🚀 Evoluindo a Implementação

Adicionando Pipeline Behaviors:

Adicionando Validação com FluentValidation:


🎯 Conclusão: Tomando a Decisão Correta

Use MediatR quando:

  1. Sistema tem muitos handlers (> 20)

  2. Precisa de cross-cutting concerns (logging, validation, caching)

  3. Trabalha com eventos de domínio

  4. Equipe grande com necessidade de desacoplamento

  5. Projeto vai crescer significativamente

Não use MediatR quando:

  1. Projeto é simples/pequeno

  2. Performance é absolutamente crítica

  3. Prefere simplicidade sobre flexibilidade

  4. Dependências explícitas são requisito

  5. Não vai usar features avançadas (behaviors, events)

Nossa implementação atual:

Recomendação final:

Comece sem MediatR para projetos simples. Quando perceber que precisa de:

  • Muitos handlers

  • Cross-cutting concerns repetitivos

  • Eventos de domínio

  • Desacoplamento forte

Então migre para MediatR. A migração é relativamente simples (como mostramos) e os benefícios valem a pena para sistemas em crescimento.

Atualizado