CQRS e padrão Mediator
ResumoCQRS separa operações de leitura (queries) das de escrita (commands). O padrão Mediator desacopla quem envia a requisição de quem a trata. Juntos, organizam a aplicação em handlers focados.
1. Objetivos de Aprendizagem#
- Explicar CQRS e seus prós/contras.
- Descrever o padrão Mediator.
- Entender quando (e quando não) adotar CQRS.
2. Pré-requisitos#
- Código assíncrono (Módulo 28).
3. Conceito#
- CQRS (Command Query Responsibility Segregation): separa o modelo de escrita (commands, que alteram estado) do de leitura (queries, que retornam dados). Podem até usar modelos/bancos distintos.
- Mediator: em vez de o controller chamar serviços diretamente, ele envia uma mensagem a um mediador, que a roteia ao handler correto.
O porquê: handlers pequenos e coesos (um por caso de uso), fácil de testar e evoluir. O tradeoff: mais arquivos e indireção — pode ser exagero em CRUDs simples.
4. Mão na Massa#
4.1. Setup#
Conceitual; a implementação com MediatR começa no próximo tópico.
4.2. Implementação Passo a Passo#
Visão do fluxo com Mediator:
Comparação:
| Aspecto | Vantagem | Desvantagem |
|---|---|---|
| Separação leitura/escrita | Modelos otimizados por finalidade | Mais código e duplicação de modelos |
| Handlers isolados | Testáveis e coesos | Indireção dificulta rastrear o fluxo |
| Escalabilidade | Ler e escrever escalam separado | Complexidade operacional (2 modelos) |
4.3. Executando#
Sem execução ainda; nos próximos tópicos implementamos com MediatR.
5. Exemplo Completo#
Um caso de uso vira um par mensagem + handler, por exemplo GetProdutosQuery/GetProdutosHandler (leitura) e CreateProdutoCommand/CreateProdutoHandler (escrita).
6. Boas Práticas e Armadilhas#
| Faça | Evite |
|---|---|
| Adotar CQRS onde leitura e escrita divergem de verdade | Aplicar CQRS em CRUD trivial |
| Handlers pequenos, um por caso de uso | Handlers "faz-tudo" |
| Documentar o fluxo para novos devs | Deixar a indireção sem mapa |
AtençãoCQRS não exige dois bancos. A forma mais simples é apenas separar commands de queries no mesmo banco. Bancos separados são um passo adicional, só quando justificado.
7. Segurança e Produção#
- Handlers isolados facilitam aplicar autorização e validação por caso de uso (ver behaviors, tópico 44.4).
8. Exercícios#
- Fácil: liste 3 queries e 3 commands da API de catálogo.
- Médio: explique um cenário onde modelos de leitura/escrita diferentes ajudam.
- Desafio: descreva quando CQRS seria overengineering no seu contexto.
9. Resumo#
CQRS separa leitura de escrita; o Mediator desacopla emissor e handler. Juntos favorecem coesão e testabilidade, ao custo de mais indireção — a adotar com critério.
10. Próximos Passos#
A seguir, implementamos requests e commands com MediatR.
11. Referências#
- Microsoft Learn — Padrão CQRS
- Microsoft Learn — CQRS e DDD em microsserviços
- Documentação — MediatR