2010-02-06 16 views

Respuesta

5

No. Sus controladores no deben manejar ninguna lógica compleja en absoluto. Mantenlos delgados; el Modelo (no DAO) debe devolver al Controlador todo lo que necesita para pasar a la Vista.

Ver consultas (o incluso consultas) en una clase de controlador es algo que consideraría un olor a código.

+1

Gracias Aaron, Buen punto. Sin embargo, hay algunas ventajas de usar IQueryable, como la flexibilidad y la facilidad de mantenimiento de los servicios, ya que la interfaz DAO crecerá menos utilizando el patrón de tuberías y filtros. ¿qué opinas? – SDReyes

+6

El código de espagueti siempre * parece * más fácil de mantener cuando un proyecto es joven y pequeño; A medida que el proyecto crezca, sin embargo, comenzará a lamentar no tener una clara separación de preocupaciones. – Aaronaught

+2

Pasar su IQueryable y/o usar tuberías y filtros no es igual al código de spaghetti. El código de espagueti generalmente es agnóstico en lo que respecta al lenguaje o la técnica. – jfar

2

Si sigue el paradigma de "modelos de grasa, controladores delgados", entonces no.

Ver este artículo en el Fat Controller anti-pattern.

+0

Gracias Robert. :) – SDReyes

4

Me encanta pasar IQueryable en mis controladores porque no tengo que crear métodos de paginación y clasificación cojos en cada método DAO e interfaz a lo largo de la vida útil del desarrollo de mis aplicaciones.

GetCustomersByLastname(string lastname) 

se convierte rápidamente en

GetCustomersByLastname(string lastname, string sortcolumn, int pagesize, int page) 

Una y otra vez y otra vez y otra vez. ¡Bleck!

Con IQueryable puede implementar la paginación y la ordenación de forma ortogonal, como aprovechar el proyecto IPagedList. La devolución de IQueryable también le brinda acceso fácil al objeto total .Count() sin más perversión de su capa de datos.

@Robert s argumento de IQueryable es igual a los controladores de grasa es muy inestable. Un controlador de grasa sería similar a las páginas hinchadas .aspx.cs de antaño. Si todo lo que hace es conectarse a su DAL y luego enviar los resultados de su no ganar "gordura" de su técnica de consulta, lo obtiene de meter mucha lógica dentro de una sola clase. Usted no obtiene un Controlador de Grasa debido a sus métodos de acceso a los datos, a menos que empiece a rodar el registro, las notificaciones y otras preocupaciones ortogonales dentro.

public ActionResult Detail(string searchTerm) 
{ 
    var model = MyDAL.MyObjects(searchTerm); 
} 

vs:

public ActionResult Detail(string searchTerm) 
{ 
    var model = MyDAL.MyObjects.Where(x => x.Name == searchTerm); 
} 

no veo una diferencia de peso.

@La respuesta de Mark Seemann es igualmente inestable. Claro, puede cambiar toda su capa de datos en el medio de un proyecto, pero eso será un desastre complejo sin importar cuán abstraído se encuentre. El ejemplo que usa es cambiar de Linq2Sql al almacenamiento de tablas de Windows Azure. RDBMS a la tienda Key/Value? Y el punto de dolor es la implementación de su repositorio? Pasar de RDBMS a una tienda Key/Value va a ser una locura que va a ser horrible sin importar qué.

Mark también muestra el Dominio de diseño en su argumento. Es ese el tipo de sistema tu edificio. ¿Hay suficiente "Dominio" en lugar de escenarios CRUD puros que hacen que este enfoque sea valioso? Si no, ¿por qué molestarse?

El uso de LINQ y la interfaz IQueryable le proporciona menos dificultades para cambiar capas de datos de todos modos. Si su cambio entre ORM que admiten LINQ e IQueryableProvider (creo que ese es el nombre) que solo el código de abajo se preocupa por ese cambio. Sus controladores se mantendrían igual cambiando desde la mayoría de los ORM en el mercado ahora.

+4

Si el propósito de esto es la clasificación y paginación, esto se puede lograr fácilmente con una interfaz 'IPager ' que envuelve 'IQueryable ' pero aún genera un modelo de dominio. Utilizo este enfoque, requiere muy poco código y elimina cualquier interacción directa entre el controlador y la base de datos. Tu comparación es extraña; parece que su proyecto carece de un modelo de dominio, en cuyo caso, por supuesto, no hay mucha diferencia, pero si no tiene un modelo de dominio, entonces realmente no tiene MVC. – Aaronaught

+1

También tenga en cuenta que cualquier búsqueda hecha usando 'IQueryable ' (supongo que es una combinación de 'OrderBy' y' Skip' aquí) va a ser ineficiente. Si bien puede ser más conveniente jugar con eso, la paginación eficiente generalmente requiere el uso de SQL crudo o procedimientos almacenados, ninguno de los cuales se prestan bien a los filtros/proyecciones 'IQueryable '. – Aaronaught

+0

@Aaronaught Me refiero al diseño impulsado por el dominio. El modelo de dominio para mí significa que alguien está usando una técnica DDD para construir su aplicación. Estaba señalando que Roberts vinculó a los defensores de las respuestas a hacer algo por el bien de DDD. Si no está utilizando DDD, algunas de las razones para devolver IEnumerable simplemente no están allí. – jfar

Cuestiones relacionadas