Conceitos de CQRS
Separe comandos de consultas para obter clareza.
Conceitos de CQRS é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.
O que é CQRS
CQRS significa Separação de Responsabilidades entre Comandos e Consultas. A ideia é simples: separar o código que altera o estado do código que lê o estado.
// Commands : change state, return little or nothing
// Queries : return data, change nothingComandos
Um comando expressa a intenção de alterar o sistema — criar um order ou cancelar uma assinatura. Ele recebe um nome imperativo e normalmente retorna apenas um identificador ou nada.
public record CreateOrderCommand(int CustomerId, string[] Items);
public record CancelOrderCommand(int OrderId);Consultas
Uma consulta solicita dados sem efeitos colaterais. Ela recebe um nome relacionado ao que retorna e transporta todos os parâmetros de filtro.
public record GetOrderByIdQuery(int OrderId);
public record ListOrdersQuery(int CustomerId, int Page);Por que separá-los
Leituras e gravações têm necessidades diferentes:
- As leituras precisam ser rápidas, desnormalizadas e adequadas ao armazenamento em cache.
- As gravações precisam de validação, regras de negócio e consistência.
Separá-las permite que cada lado evolua e seja dimensionado de forma independente.
// Read side -> optimized projections / DTOs
// Write side -> domain rules / transactionsO padrão de handler
Cada comando ou consulta é processado por um handler dedicado. Uma mensagem, um handler, uma responsabilidade — isso mantém as classes pequenas e focadas.
// CreateOrderCommand -> CreateOrderHandler
// GetOrderByIdQuery -> GetOrderByIdHandlerControladores enxutos
Com CQRS, os controladores ficam enxutos. Eles constroem uma mensagem e a encaminham; toda a lógica fica no handler. Isso elimina controladores muito grandes e melhora a capacidade de teste.
[HttpPost]
public async Task<IActionResult> Create(CreateOrderCommand cmd)
{
var id = await _sender.Send(cmd);
return CreatedAtAction(nameof(Get), new { id }, null);
}CQRS não é armazenamento de eventos
Uma confusão comum: CQRS é apenas a separação entre leitura e gravação. O armazenamento de eventos (armazenar o estado como um registro de eventos) é um padrão separado que combina bem com CQRS, mas não é obrigatório.
// You can do CQRS with a plain single database.Armazenamentos de dados únicos versus separados
O CQRS básico usa um banco de dados para ambos os lados. Configurações avançadas usam armazenamentos separados para leitura e gravação, mantidos em sincronia, aceitando consistência eventual para obter escala. Comece de forma simples.
// Level 1: one DB, separate handlers (most apps)
// Level 2: separate read/write models
// Level 3: separate read/write databasesBenefícios
O CQRS oferece:
- Handlers claros e com uma única finalidade.
- Testes mais fáceis — cada handler é testado isoladamente.
- Um local natural para preocupações transversais, como validação e registro.
- Dimensionamento independente de leituras e gravações.
// One class per use case = easy to find and testCustos
O CQRS adiciona mais classes e níveis de indireção. Para um aplicativo CRUD simples, ele pode ser exagerado. Aplique-o quando a lógica de negócio for rica ou o domínio for complexo.
// Trade-off: clarity & scale vs. boilerplateConheça o MediatR
A biblioteca MediatR implementa o padrão de mediador no processo, que encaminha cada mensagem ao seu handler, para que você não precise conectá-los manualmente. O restante deste curso usa essa biblioteca.
dotnet add package MediatRVerificação rápida
Confirme a distinção fundamental.
Recapitulação
Você aprendeu os conceitos de CQRS:
- Separe comandos (alterações de estado) de consultas (leituras).
- Cada mensagem tem um handler focado, mantendo os controladores enxutos.
- O CQRS é independente do armazenamento de eventos e pode usar um único banco de dados.
- O MediatR encaminha mensagens aos componentes handler.
Próximo tópico: comandos e handlers com MediatR.
Perguntas Frequentes
A aula “Conceitos de CQRS” é grátis?
Sim — o texto completo de “Conceitos de CQRS” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.
O que vou aprender em “Conceitos de CQRS”?
Separe comandos de consultas para obter clareza. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar C# Academy?
Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Conceitos de CQRS”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de C# Academy?
Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Conceitos de CQRS
- Comandos e manipuladores com MediatR
- Comportamentos de pipeline
- Notificações e eventos