Patrones de solución
Recetas tácticas más allá del GoF. Pipeline, Provider, CQRS, Repository, Saga, Specification…
Patrones que no están en el libro original del Gang of Four pero aparecen una y otra vez en sistemas modernos: pipelines de procesamiento, proveedores intercambiables, separación de lectura y escritura, transacciones distribuidas, resiliencia de red y más.
#El problema
Hay problemas que no son de diseño OO clásico y aparecen en cualquier proyecto de cierto tamaño: ¿cómo coordino una transacción que cruza tres servicios? ¿cómo evito tirar abajo a un proveedor que ya está caído? ¿cómo separo lecturas masivas de escrituras críticas? Sin recetas conocidas, cada equipo reinventa la rueda — y la suele inventar mal, descubriendo los casos borde recién en producción.
#La solución
Estos patrones tácticos son herramientas batalladas por la comunidad:
Circuit Breaker para resiliencia, Outbox para consistencia eventual,
Repository y Specification para aislar persistencia, CQRS y Saga para
separar responsabilidades a escala. Los nombras una vez y todo el equipo entiende
qué garantías te da y qué problemas no resuelve.
Algunos vienen de Domain-Driven Design (Repository, Specification, Unit of Work), otros nacen de arquitectura distribuida (CQRS, Event Sourcing, Saga, Outbox) y otros son simplemente mecanismos de plomería que todo equipo termina inventando (Pipeline, Provider, Circuit Breaker).
#Por qué los separamos del GoF
Porque su escala es distinta. Mientras un Strategy vive dentro de una clase, un Saga coordina varios servicios y un Outbox afecta hasta cómo configurás tu base de datos. Mezclarlos con los 23 clásicos solo confunde.
#En este capítulo
- Resiliencia y comunicación —
Circuit Breaker,Outbox,Pipeline,Provider. - Persistencia y dominio —
Repository,Unit of Work,Specification. - Arquitectura distribuida —
CQRS,Event Sourcing,Saga. - Composición —
Dependency Injectioncomo lenguaje común.
Cada uno con su ejemplo en C#, sus variantes idiomáticas y, sobre todo, cuándo no lo necesitás todavía.
#Lecturas relacionadas
- Si venís de los clásicos: Patrones de diseño.
- Si estás decidiendo la macro-estructura: Arquitectura de aplicación.
- Pipeline — Procesa datos a través de una secuencia ordenada de pasos (stages) que transforman su entrada en salida.
- Producer / Consumer — Desacopla quien genera trabajo de quien lo procesa, usando una cola en memoria como buffer intermedio.
- Provider Pattern (simple) — Abstrae el acceso a un recurso o servicio externo intercambiable, configurable en runtime.
- Specification — Encapsula reglas de negocio que devuelven booleanos en objetos componibles (AND, OR, NOT).
- Unit of Work — Mantiene una lista de operaciones afectadas por una transacción de negocio y coordina su escritura.
- Repository — Media entre el dominio y el almacenamiento, exponiendo colecciones in-memory ilusorias.
- Dependency Injection — Provee dependencias a un objeto desde fuera en lugar de que las construya él mismo.
- CQRS — Separa el modelo de lectura del modelo de escritura para optimizar cada uno por separado.
- Event Sourcing — Persiste el estado como una secuencia inmutable de eventos en lugar del estado actual.
- Saga — Coordina transacciones de larga duración entre servicios mediante pasos y compensaciones.
- Transactional Outbox — Publica eventos de forma fiable a un message broker desde una base de datos transaccional.
- Circuit Breaker — Protege al sistema de fallos en cascada cortando llamadas a un servicio en problemas.