Repository
Media entre el dominio y el almacenamiento, exponiendo colecciones in-memory ilusorias.
Contexto
Quieres trabajar con tu dominio como si fueran colecciones, sin saber si detrás hay SQL, NoSQL o un API.
Problema
- Mezclar lógica de negocio con SQL contamina el dominio.
- Cambiar la persistencia obliga a tocar el dominio.
Solución
Una interfaz IXxxRepository con Add, GetById, Find que oculta la persistencia.
#Ejemplo en C#
public interface IOrderRepository
{
Task<Order?> GetAsync(Guid id);
Task<IReadOnlyList<Order>> FindByCustomerAsync(Guid customerId);
void Add(Order order);
void Remove(Order order);
}
public class EfOrderRepository : IOrderRepository
{
private readonly AppDbContext _db;
public EfOrderRepository(AppDbContext db) => _db = db;
public Task<Order?> GetAsync(Guid id) => _db.Orders.FindAsync(id).AsTask();
public Task<IReadOnlyList<Order>> FindByCustomerAsync(Guid customerId) =>
_db.Orders.Where(o => o.CustomerId == customerId).ToListAsync()
.ContinueWith(t => (IReadOnlyList<Order>)t.Result);
public void Add(Order o) => _db.Orders.Add(o);
public void Remove(Order o) => _db.Orders.Remove(o);
}Cuándo NO aplicarlo
- Sobre EF Core ya tienes un repositorio (
DbSet<T>). Envolverlo añade ruido salvo que el contrato del dominio sea más estrecho (read models, queries específicas). - Para reads simples → considera CQRS con queries directas.
Tradeoffs
| Pro | Contra |
|---|---|
| Aísla el dominio del ORM | Capa fina que muchas veces solo delega |
| Tests con repositorios fake | Riesgo de exponer LINQ y filtrar EF al dominio |
#extra #ddd #persistence