Bueno, no estoy seguro de si ese es exactamente el título correcto, pero básicamente he tenido muchos problemas al usar repositorios en aplicaciones MVC de tal manera que puede sustituir un conjunto de repositorios, implementar una tecnología de almacenamiento de datos diferente, para otro.Usando el patrón de repositorio para soportar múltiples proveedores
Por ejemplo, supongamos que quiero utilizar Entity Framework para mi aplicación. Sin embargo, también quiero tener un conjunto de datos de prueba implementados en listas codificadas. Me gustaría tener un conjunto de interfaces (IUserRepository, IProductRepository, etc. - no hablemos de un IRepository más genérico <T> por ahora) que ambos enfoques pueden crear instancias. Luego, usando (digamos) una herramienta de inyección de dependencias como Ninject o Castle Windsor, puedo cambiar entre el proveedor de la entidad marco (accediendo a la base de datos real) y el proveedor de la prueba (accediendo a las listas).
En pocas palabras, aquí está el problema:
- Si se va a utilizar Entity Framework, desea que sus repositorios de regresar IQueryable <SomeType>.
- Si va a utilizar listas codificadas, NO quiere que sus repositorios devuelvan IQueryable, porque agrega mucho a la sobrecarga, y además, Linq to Entities es significativamente diferente de Linq to Objects, causando muchos dolores de cabeza en el código que es común para ambos proveedores.
En otras palabras, he encontrado que el mejor enfoque aísla todo el código dependiente de EF dentro de los repositorios, para que los repositorios devuelvan IEnumerable o IList o algo así - entonces tanto EF como otras tecnologías pueden usar el mismos repositorios. Por lo tanto, todas las IQueryable estarían contenidas DENTRO de los repositorios de EF. De esta forma, puede usar Linq para Entidades con los repositorios de EF, y Linq para Objetos con los repositorios de Prueba.
Sin embargo, este enfoque pone una enorme cantidad de la lógica de negocios en los repositorios, y resulta en código muy duplicado: la lógica debe duplicarse en cada uno de los repositorios, incluso si las implementaciones son algo diferentes.
Toda la idea de los repositorios como esta capa que es muy delgada y simplemente se conecta a la base de datos se pierde entonces; los repositorios son "depósitos" de lógica de negocios así como de conectividad de almacenamiento de datos. No puede simplemente tener Buscar, Guardar, Actualizar, etc.
No he podido resolver esta discrepancia entre la necesidad de aislar el código dependiente del proveedor y tener lógica comercial en una ubicación centralizada.
¿Alguna idea? Si alguien pudiera señalarme un ejemplo de implementación que aborde esta preocupación, le agradecería mucho. (He leído mucho, pero no puedo encontrar nada de lo que habla específicamente sobre estos temas.)
ACTUALIZACIÓN:
Creo que estoy empezando a sentir que no es probable que sea posible tener repositorios que pueden ser intercambiado por diferentes proveedores, por ejemplo, si va a utilizar Entity Framework, solo debe dedicar toda su aplicación a Entity Framework. Pruebas unitarias? Estoy luchando con eso. Mi práctica hasta ahora ha sido establecer un repositorio separado con datos codificados y usarlo para pruebas unitarias, así como probar la aplicación antes de configurar la base de datos. Creo que tendré que buscar una solución diferente, quizás alguna herramienta burlona.
Pero entonces surge la pregunta de por qué usar repositorios, y especialmente por qué usar interfaces de repositorio. Estoy trabajando en esto.Creo que determinar la mejor práctica va a llevar un poco de investigación.
Otra publicación sobre IQueryable: http: // stackoverflow.com/questions/718624/to-return-iqueryablet-or-not-return-iqueryablet – aqwert
En pocas palabras, resume el estado en el que creo que todos se encuentran y las preguntas que tienen en algún momento a lo largo de la línea al aprender .net/mvc/ef/patrones de diseño. Preguntas y respuestas útiles –