Pregunta

Tengo una aplicación de múltiples capas que comienza con el patrón de repositorio para todo el acceso a los datos y devuelve IQueryable a la capa de servicios. La capa de servicios, que incluye toda la lógica de negocios, devuelve ilist a los controladores (nota: estoy usando ASP.NET MVC para la capa de interfaz de usuario). El beneficio de devolver IQueryable en la capa de acceso a datos es que permite que mis repositorios sean extremadamente simples y las consultas de la base de datos se aplazaran. Sin embargo, estoy activando las consultas de la base de datos en mi capa de servicios para que mis pruebas unitarias sean más confiables y no doy flexibilidad a los controladores para remodelar mis consultas. Sin embargo, recientemente encontré varias situaciones en las que diferir la ejecución de consultas a los controladores habría sido significativamente más desempeñada porque los controladores tenían que hacer algunas proyecciones en los datos específicos de la UI. Además, con el surgimiento de cosas como Odata, estaba empezando a preguntarme si los puntos finales (por ejemplo, interfaz de usuario web o API web) deberían trabajar directamente con Iqueryable. ¿Cuáles son tus pensamientos? ¿Es hora de comenzar a devolver iQueryable desde la capa de servicios a la capa de interfaz de usuario? ¿O quédate con Ilist?

Este hilo aquí: Para devolver iqueryableu003CT> o no devolver iqueryableu003CT>Parece garantizar para devolver a Ilist a las capas de la interfaz de usuario, pero me preguntaba si las cosas están cambiando debido a las nuevas tecnologías y técnicas emergentes.

¿Fue útil?

Solución

Me gusta seguir con la interfaz IQueryable cuando sea posible, el único problema es cuando terminas haciendo un filtrado complejo o vuelve a pedido a nivel del controlador, si tienes algo como:

//DATA ACCESS
    public IQueryable<T> GetStudents()
    {
    return db.Students;
    }

Y en su controlador hace un ree-sharping porque su cliente quiere filtrar algunos datos de ese resultado, seguramente tendrá la tentación de hacerlo a nivel del controlador:

var result = obj.GetStudents().Where(d=>d...);

Y para mí está bien, pero solo imagina si algún otro módulo necesita usar ese mismo filtro, no puede llamarlo porque está a nivel del controlador. Entonces, para mí, es algo de equilibrio entre seco, flexibilidad y cuán escalable es el sistema. Si necesita un sistema totalmente escalable, deberá hacer algunas o varias sobrecargas para obtener el método GetStudents () y deshacerse de cualquier rehoramiento a nivel del controlador.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top