CQRS en C#: Guía Completa

Introducción: Separar lectura y escritura

CQRS separa el modelo de comandos (escrituras) del modelo de consultas (lecturas). Esto permite optimizar cada camino de forma independiente.

Las escrituras priorizan consistencia y reglas del dominio; las lecturas priorizan velocidad y proyecciones eficientes.

La separación reduce acoplamiento y facilita escalar donde realmente hay presión (normalmente, las lecturas).

CQRS
Prompt: CQRS split read and write paths, clean minimal style.

1. Naturaleza: Carriles separados

En una autopista con carriles separados para buses y autos, cada flujo avanza sin estorbar al otro.

CQRS replica esa idea: las consultas no compiten con las escrituras y pueden evolucionar distinto.

Carriles
Prompt: Separated traffic lanes, soft illustration.

2. Mundo Real: E-commerce con alto tráfico

El catálogo tiene miles de lecturas por segundo, mientras que las compras son menos frecuentes.

Con CQRS, las lecturas usan vistas optimizadas y cacheadas, y las compras pasan por reglas estrictas del dominio.

E-commerce
Prompt: E-commerce read/write split, clean flat style.

3. Implementación en C#: Código Paso a Paso

public record CrearPedido(string Id, decimal Total);
public record ObtenerPedido(string Id);

public class CommandHandler
{
    public void Handle(CrearPedido cmd) { /* validar y persistir */ }
}

public class QueryHandler
{
    public PedidoDto Handle(ObtenerPedido q) => new PedidoDto();
}

En escenarios avanzados, las consultas leen de proyecciones específicas o bases dedicadas.

Combina con Event Sourcing si necesitas historial completo de cambios.

4. CQRS vs CRUD tradicional

CRUD usa un modelo único para todo. CQRS separa responsabilidades y permite optimizaciones específicas.

Si tu dominio es simple, CRUD suele bastar. CQRS brilla cuando hay carga de lectura masiva o reglas complejas.

5. Diagrama UML

UML CQRS
Prompt: UML diagram of CQRS pattern, clean vector layout.
Flujo CQRS
Prompt: CQRS flow diagram, minimal infographic style.

⚠️ Cuándo NO Usar CQRS

  • Si el dominio es pequeño y sin carga de lectura relevante.
  • Si el equipo no puede mantener modelos separados.
  • Si la complejidad añadida no se justifica.

💪 Ejercicio

Diseña un CQRS para un catálogo: comandos para alta/edición y consultas optimizadas para listados.

Conclusión

CQRS mejora escalabilidad y claridad al separar lectura y escritura.

Es especialmente útil cuando la lectura domina y el dominio tiene reglas complejas.