Usando el patrón Repository, ¿es apropiado devolver un IQueryable de un conjunto de datos (tabla), para uso genérico?
Es muy útil en muchos casos, especialmente cuando se usan bibliotecas externas que aprovechan esa interfaz, por ejemplo, algunos complementos que ordenan / filtran y se unen a elementos ui.
Sin embargo, exponer un IQueryable a veces parece dejar el diseño propenso a errores. Esto, junto con un uso incorrecto de la carga diferida podría provocar graves problemas de rendimiento.
Por otro lado, tener métodos de acceso para cada uso parece redundante y también requiere mucho trabajo (considerando pruebas unitarias, etc.).
design-patterns
programming-practices
orm
patterns-and-practices
Mihalis Bagos
fuente
fuente
new DbContext()
cuando lo necesitan y llamanSaveChanges()
cuando quieren. No es posible probar nada y solo puedo pensar en una capa adicional que lo oculta.Respuestas:
Mark Seemann tiene una excelente publicación de blog sobre este tema: IQueryable is Tight Coupling . Lo resume muy bien en la parte final (énfasis mío):
ORM's como Entity Framework son implementaciones del repositorio y el patrón de unidad de trabajo. No hay necesidad de envolverlos en otro.
fuente
new DbContext()
controlador y la lógica compleja en un solo método en MVC y luego no ponga también algo de lógica en las vistas? Tengo un código heredado donde no puedo hacer ninguna prueba unitaria. Para habilitar las pruebas y evitar que las personas hagan códigos realmente malos, necesito una capa adicional. Por lo tanto, necesito implementar mis propios repositorios con fines educativos.No habrá consenso sobre esto. En mi opinión y experiencia, un repositorio debería devolver objetos con usos específicos. Como mínimo, si utiliza el patrón de repositorio como lo define Eric Evens en DDD. Un repositorio es un "puente" que conecta la lógica empresarial, la persistencia y las fábricas.
Si desea acceder a la persistencia más directamente, tal vez esté buscando el Patrón de puerta de enlace.
Sin embargo, por lo que dices aquí, te gustaría ocultar esa exposición a la persistencia para que el Patrón de Proxy te sea útil.
fuente