01

Qué es y qué problema resuelve

Un repositorio ofrece acceso a agregados mediante un contrato orientado al caso de uso. Puede ser útil para aislar una frontera o expresar lenguaje.

DbSet y DbContext ya cubren muchas capacidades: envolver cada método con CRUD genérico puede duplicar abstracciones sin ganar garantías.

02

Ejemplo paso a paso

Repository Pattern con propósito · caso de reservasC#

Punto de partida Contrato utilizado por CancelarReserva en el laboratorio. La implementación en memoria enseña el límite, sin garantizar persistencia.

Antes de ejecutar

Contrato C# que usa Reserva del laboratorio; falta implementar el adaptador y definir sus garantías de búsqueda y guardado. La interfaz por sí sola no configura persistencia ni autorización.

public interface IReservas
{
    Task<Reserva?> BuscarAsync(Guid id, CancellationToken ct);
    Task GuardarAsync(CancellationToken ct);
}

Cómo funciona

  1. Lee las operaciones que realmente necesita el caso de uso.
  2. Identifica qué promete el repositorio sobre consulta y confirmación.
  3. Implementa ese contrato en infraestructura y prueba su comportamiento real.

Resultado esperado: El caso de uso coordina acceso y transición sin conocer el motor.

03

Cuándo usarlo y qué debes evitar

Define si GuardarAsync confirma trabajo pendiente y dónde vive la unidad de trabajo. Evita devolver IQueryable sin límites claros porque permite al consumidor construir consultas arbitrarias fuera del adaptador.

No confundas un fake rápido con una implementación real de transacciones o concurrencia.

Ampliación opcional · contexto y variantes del tema

Clean Architecture y modelo del dominio

Organiza dependencias hacia reglas estables. Dominio contiene Reserva e Intervalo; Aplicación define CancelarReserva e IReservas; Infraestructura implementa almacenamiento; API compone y traduce HTTP. La separación se expresa con referencias entre proyectos, no solo con nombres de carpetas. Dominio no debe referenciar EF Core ni ASP.NET Core. La API sí puede conocer Infraestructura para registrar adaptadores en su raíz de composición.

DDD ayuda cuando hay vocabulario y reglas complejas: entidad tiene identidad, objeto de valor representa un concepto y agregado delimita consistencia local. No convierte cada tabla en un agregado ni obliga a microservicios. Reserva protege su transición; la capacidad compartida de Sala puede requerir coordinación fuera de ese objeto. Define el límite según las reglas y la transacción que necesitas, no según la pantalla.

Repository es una abstracción orientada a recuperar y persistir agregados. EF Core ya ofrece muchas capacidades de repositorio y unidad de trabajo mediante DbSet y DbContext. Una capa adicional debe aportar lenguaje, aislamiento o una frontera de pruebas útil. Evita una interfaz genérica que replique todos los métodos de EF o esconda IQueryable sin política clara.

Referencias que puedes verificarTexto

Punto de partida Las flechas significan referencias de compilación. En ejecución la aplicación llama al adaptador inyectado, pero su código solo depende del contrato.

Antes de ejecutar

Esquema de diseño

Reserva.Dominio       → ninguna capa del sistema
Reserva.Aplicacion    → Reserva.Dominio
Reserva.Infraestructura → Reserva.Aplicacion + Reserva.Dominio
Reserva.Api           → Reserva.Aplicacion + Reserva.Infraestructura
Reserva.Pruebas       → proyectos bajo prueba

Resultado esperado: Puedes cambiar un adaptador sin agregar una referencia de infraestructura al dominio.

04 · Práctica guiada · opcional

Practica lo aprendido

Justifica usar este repositorio frente a consultar DbContext directamente desde aplicación.

  1. 01Prepara el ejemplo con las dependencias indicadas en «Antes de ejecutar».
  2. 02Justifica usar este repositorio frente a consultar DbContext directamente desde aplicación.
  3. 03Comprueba y registra el resultado: El caso de uso coordina acceso y transición sin conocer el motor.
Ver solución orientativa

Documenta qué frontera protege y qué costo agrega. Una interfaz para un contexto puede ser otra alternativa, si su acoplamiento es aceptable.

05

Comprueba lo aprendido

Responde antes de abrir la explicación. Esta comprobación es opcional y no guarda una puntuación.

01¿Un repositorio garantiza independencia del motor en todas las consultas?

No. Traducción, aislamiento y rendimiento siguen necesitando integración.

02¿Qué garantía tendría que aportar IReservas para justificar esta abstracción?

Debe ofrecer una frontera y semántica útiles, como qué busca, cómo representa ausencia y cuándo confirma cambios. Si solo replica DbContext sin una garantía adicional, revisa si su costo se justifica.

Cómo demostrar el objetivo

Compara tu práctica con estos resultados. Si solo diseñaste una prueba, registra su resultado como esperado, no como observado.

  • El contrato explica búsqueda, ausencia y confirmación de cambios.
  • La decisión justifica la frontera y reconoce que traducción y consistencia requieren pruebas del proveedor.

Qué debes recordar

  • Un repositorio debe tener un propósito.
  • La confirmación y la unidad de trabajo necesitan un alcance explícito.
Tu cuaderno · notas personales

Cuaderno local

Tus notas del contenido

Se guardan únicamente en este dispositivo. Puedes exportarlas cuando quieras.

Guardado local automático
Material de apoyo · descarga, glosario y referencias
Libro de trabajo · Repository Pattern con propósitoLaboratorio C# · núcleo y 15 comprobaciones

Explicaciones, ejemplos y prácticas propios de Academia de Software. Los fragmentos de integración requieren las dependencias indicadas; el ZIP contiene el núcleo de consola. Las lecturas externas se consultan en su sitio original y conservan sus condiciones. Procedencia y condiciones de uso.