2010-01-01 17 views
9

Estoy construyendo un sitio similar a StackOverflow, principalmente como un ejercicio de aprendizaje, y estoy teniendo dificultades para entender cómo decidir sobre los diferentes controladores en el patrón MVC.Comprender los controladores en MVC

¿Qué es exactamente un controlador? ¿Qué controladores usaría para modelar un Q & Un sitio web similar a SO? Estoy usando ASP.Net MVC, y noto que el patrón de URL siempre es "/ Controller/Action", pero definitivamente no es como me gustaría que se vean las URL finales ("/ Question/123" no se ajusta en ese patrón). ¿Es eso una consideración?

Sé que esto es en realidad una mezcla de varias preguntas ... tal vez lo que realmente necesito es un buen tutorial para comprender los conceptos básicos.

Respuesta

1

Por lo que yo sé, es en gran medida la preferencia. Una vez me hice la misma pregunta, pero descubrí que los controladores son solo eso, que reúne puntos de vista y modelos para presentar información de manera ordenada.

Creo que podría tener un controlador de Preguntas, con métodos como Ver, Editar, Crear, etc. Esto parece tener sentido, especialmente para el proyecto - un Q & Un sitio.

1

El controlador en una arquitectura MVC es responsable de hacer el modelo para los datos y proporcionar datos a la vista. La razón para tener un controlador es mantener el desacoplamiento entre el modelo y la vista. En general, se reconoce que es deseable y necesario el acoplamiento libre o inexistente entre componentes en un sistema oo. Admite la reutilización y la encapsulación, y por lo tanto promueve la capacidad de mantenimiento.

El patrón MVC cuando se utiliza en el contexto de una aplicación web reparador apoyará un controlador que procesa las URL con los algo como siguiente formato:

/Controlador/Acción /: id

Así que para ver una sola pregunta, por ejemplo, tendría:/questions/view/123. Se puede encontrar un gran artículo sobre el diseño de una aplicación web relajante (basada en delicatessen, li, cious) here.

+0

El controlador tiende a ser el que realiza acciones en el modelo donde las vistas tienden a presentar objetos de dominio definidos por el modelo. El controlador específicamente no está ahí para interponerse entre la vista y el modelo; si se tratara simplemente de un mediador, entonces está hablando del clásico modelo de 3 niveles y no del MVC. –

+0

¿El controlador también verifica la información que se ingresa en un sistema? –

+0

@ D.Shawley - Creo que estás rompiendo pelos, pero tienes razón, no mencioné que el controlador actualiza el modelo y lo consulta. Sin embargo, yo diría que el controlador está ahí para pararse específicamente entre el modelo y la vista, ya que es muy posible que el modelo y la vista se comuniquen directamente. La razón por la que no quiere eso es para mantener el desacoplamiento. Desacoplamiento de los resultados de la implementación de un controlador (moderador). – ennuikiller

1

La forma en que lo veo es que todo lo que desea realizar acciones en o necesita un controlador. Entonces, por ejemplo, en el sitio Q/A podría ser algo así como ...

Si lo construimos con las siguientes entidades y relaciones

usuario

  • tiene muchas preguntas
  • tiene muchas respuestas

Pregunta

  • pertenece a un usuario
  • tiene muchas respuestas

respuesta

  • pertenece a un usuario
  • Belogns a la pregunta

Entonces podemos tener los siguientes controladores tratando con ac ciones realizadas en las entidades anteriores.

  • UsersController - Se ocupa de actualización de creación y eliminación de usuarios
  • QuestionsController - Ofertas con actualización de creación y eliminación de Preguntas
  • AnswersController - Se ocupa de actualización de creación y eliminación de Respuestas

Su controlle Es muy probable que los rs tengan más métodos que los mencionados.

El siguiente bit es un poco complicado, ya que no son solo los modelos para los que quieres controladores (y algunos modelos no querrás controladores). Si va a hacer que un usuario inicie sesión, entonces crearía un controlador de sesiones que se ocupará del inicio y cierre de sesión.

Trate de pensar en qué entidades se inventará su sistema y escríbalo. Luego de esos, piense en cuáles realizarán acciones con y con. Luego, puede pensar en controladores adicionales necesarios, como un controlador de sesiones.

Y además, los Modelos son básicamente los objetos/entidades de su sistema, los Controladores realizan acciones con esas entidades y las Vistas modifican el modelo.

2

Vamos a romper su pregunta en dos:

  1. ¿Cuál es el papel de controlador en el sabor MVC ofrecido por monorraíl y ASP.NET MVC?
  2. ¿Cómo se relacionan las asignaciones de url con acciones de aplicación?

Mi opinión sobre 1:

Como este tipo de pregunta se presta a muchas respuestas religiosamente, creo que la hay "una manera de gobernar a todos". Ahora en el monorriel y ASP.NET MVC (y también RoR por supuesto), un controlador es simplemente una colección de acciones. La pregunta correcta entonces es "¿Cuál es el papel de la acción"?

En mi libro (el libro de Monorraíl en acción no escrito ... :)), el papel de la Acción es separar el Modelo de Dominio de la presentación, tanto en términos de estructuras de datos como en cuestiones de interés. Todo lo que está especializado en el hecho de que la interfaz con el dominio es a través de solicitudes WEB, es responsabilidad de la capa del controlador. Eso incluye el enlace de datos y las transformaciones, que tratan con la Autenticación (pero no la autorización), y la toma de decisiones para las plantillas de vista. Entonces, una acción tomará los parámetros de la solicitud entrante (una web es no una cuestión de dominio), enlazarlos a datos significativos que se pueden enviar al dominio como una consulta o comando, en el idioma del dominio, sin cookies, FORMULARIO, QueryString y otras "cosas web". También, al ver los datos, transformará los objetos de dominio devueltos del Modelo, en un Modelo de vista, que en el mismo libro mencionado anteriormente es un modelo separado del modelo de Dominio, y está a cargo de suministrar la vista -plantear con todos los datos y la toma de decisiones que necesita. Así, por ejemplo., La vista no debe pedir if (view.User.IsAdmin) y hacer un botón "Editar", pero en cambio la acción del controlador habrá hecho esta pregunta, y se suministra la vista con una decisión, para el fin de pedir if (view.ShouldRenderEditButton)

por lo , la capa Controladores separa las preocupaciones de WEB de las preocupaciones de DOMINIO.

En cuanto a la pregunta no. 2:

La idea de asignar la url como Controlador/Acción es simplemente una consecuencia de adoptar el enfoque "Convención sobre la configuración". Es decir, sería más fácil para los desarrolladores (y los consumidores) trabajar con un esquema común en diferentes aplicaciones web. Dicho esto, no está escrito en piedra, y como cualquier Convención, es una base para la Adaptación. Entonces, si está construyendo un sitio web y el gerente de producto le pide "URL bonitas", entonces simplemente configura su motor de rutas en consecuencia.

3

En palabras simples, un controlador es un contrato/puente entre un modelo y la vista.

Aquí es el flujo:

Un controlador se utiliza para la lógica de procesamiento principal petición. Si una página tiene que hablar con la base de datos, , el controlador envía una solicitud al modelo, el modelo realiza su tarea con db y devuelve algunos registros de respuesta o db al controlador, luego el controlador envía esta respuesta a la vista.

El cuadro siguiente explica el proceso más fácilmente:

alt text http://www.shopno-dinga.com/dustbin/mvc.png

+1

¿De dónde es la foto? –

+0

Eche un vistazo a http://heim.ifi.uio.no/~trygver/themes/mvc/MVC-2006.gif para obtener un mejor diagrama de MVC de uno de sus inventores. –

+0

La línea entre el modelo y el controlador con la etiqueta "datos" realmente debe estar entre el modelo y la vista. El controlador manipula el modelo y la vista observa el modelo. –

0

Un controlador forma el límite del sistema, que es la interfaz http de su aplicación. Toma una solicitud, desencadena el procesamiento de la solicitud y devuelve el resultado al cliente.

Puede poner todas las acciones que pertenecen a una cierta clase de objetos de dominio en un solo controlador.Esto llevaría al patrón de URL mencionado/$ controlador/$ acción. Sugeriría usar REST. Con REST, piensas en "recursos" en lugar de "controladores" y "acciones". Cada recurso tiene un conjunto común de métodos, a saber, ELIMINAR, OBTENER, PUBLICAR y PONER. Estos métodos son los verbos HTTP. Tendría más recursos que los controladores con el enfoque sin REST, pero el número total de acciones sería el mismo.

En su ejemplo, un recurso sería "preguntas", que sería una lista de todas las preguntas. Para crear una nueva pregunta, el cliente enviaría una solicitud http como "POST/questions $ formdata". Se creará un nuevo objeto de pregunta y se agregará a la lista. El cliente obtendría una redirección a la pregunta recién creada "redirect/questions/4128" y luego la carga con "GET/question/4128".

descansar en corto:

  • cada recurso tiene una identificación global (URL)
  • cada recurso tiene un conjunto común de métodos (BORRAR, GET, POST, PUT)
  • una aplicación resto es sin estado (sin estado de sesión entre peticiones)

Beneficios:

  • simple
  • unificado; fácil de entender para desarrolladores nuevos, fácil de usar para desarrolladores clientes
  • utilizable con múltiples clientes como navegadores, agregadores de feeds, servicios web ...
  • REST utiliza toda la potencia de http sin gastos generales (en comparación con los servicios web SOAP)
Cuestiones relacionadas