En MVC, se debe llamar a DAO desde el controlador o modelo

14

He visto varios argumentos contra el DAO que se llama directamente desde la clase Controlador y también el DAO desde la clase Modelo. De hecho, personalmente siento que si seguimos el patrón MVC, el controlador no debería acoplarse con el DAO, sino con la clase Modelo debería invocar el DAO desde dentro y el controlador debería invocar la clase de modelo. Por eso, podemos desacoplar la clase de modelo aparte de una aplicación web y exponer las funcionalidades de varias maneras, como para que un servicio REST use nuestra clase de modelo.

Si escribimos la invocación DAO en el controlador, no sería posible que un servicio REST reutilice la funcionalidad ¿verdad? He resumido los dos enfoques a continuación.

Enfoque n. ° 1

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            new CustomerDAO().save(customer);

    }


 }

Enfoque n. ° 2

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

            Customer customer = new Customer("xxxxx","23",1);
            customer.save(customer);

    }


 }

 public class Customer {

   ...........

   private void save(Customer customer){

        new CustomerDAO().save(customer);

   }

}

Nota -

Esto es lo que es una definición de Modelo:

Modelo: el modelo administra el comportamiento y los datos del dominio de la aplicación, responde a las solicitudes de información sobre su estado (generalmente desde la vista) y responde a las instrucciones para cambiar el estado (generalmente desde el controlador).

En los sistemas controlados por eventos, el modelo notifica a los observadores (generalmente vistas) cuando la información cambia para que puedan reaccionar.

Necesitaría una opinión experta sobre esto porque encuentro que muchos usan # 1 o # 2, ¿cuál es?


fuente
El controlador debe cargar todo desde el modelo y pasarlo a la vista.
jgauffin
¿Estás sugiriendo el enfoque # 2?
1
"Un controlador puede enviar comandos a su vista asociada para cambiar la presentación de la vista del modelo (por ejemplo, desplazándose por un documento). Puede enviar comandos al modelo para actualizar el estado del modelo (por ejemplo, editar un documento)". .. emm .. ¿dónde dice que ese controlador debería extraer datos o pasarlos?
Mefisto

Respuestas:

31

En mi opinión, debe distinguir entre el patrón MVC y la arquitectura de 3 niveles. Para resumir:

Arquitectura de 3 niveles:

  • datos: datos persistentes;
  • servicio: parte lógica de la aplicación;
  • presentación: hmi, servicio web ...

El patrón MVC tiene lugar en el nivel de presentación de la arquitectura anterior (para una aplicación web):

  • datos: ...;
  • Servicio: ...;
  • presentación:
    • controlador: intercepta la solicitud HTTP y devuelve la respuesta HTTP;
    • modelo: almacena los datos que se mostrarán / tratarán;
    • vista: organiza la salida / visualización.

Ciclo de vida de una solicitud HTTP típica :

  1. El usuario envía la solicitud HTTP;
  2. El controlador lo intercepta;
  3. El controlador llama al servicio apropiado;
  4. El servicio llama al dao apropiado, que devuelve algunos datos persistentes (por ejemplo);
  5. El servicio trata los datos y los devuelve al controlador;
  6. El controlador almacena los datos en el modelo apropiado y llama a la vista apropiada;
  7. La vista se instancia con los datos del modelo y se devuelve como la respuesta HTTP.
sp00m
fuente
Lo que llama "ciclo de vida de una solicitud HTTP típica" no es MVC. Y DAO es solo un objeto, que facilita la interacción / traducción entre la lógica de dominio y la persistencia. NO es un nombre diferente para el registro activo. Además ... ¿desde cuándo el modelo se ha convertido en parte de la presentación?
Mefisto
1
@teresko 1) Sí, es MVC, pero dentro de una arquitectura de 3 niveles. Si no, ¿por qué? 2) Tenías razón, edité. 3) Dado que todo el patrón MVC tiene lugar en el nivel de presentación. Ejemplo típico: Spring MVC, cuyos modelos son solo mapas que contienen pares clave-valor. SpringFuse también ha hecho esta elección.
sp00m
2
Tengo que estar de acuerdo con @ sp00m aquí ... Su descripción de una solicitud HTTP típica es precisa para una aplicación web MVC, y su posicionamiento del Modelo (como la 'M' en MVC) como parte del nivel de presentación también es correcto . En las aplicaciones MVC de n niveles, el 'Modelo' es típicamente la fachada del nivel de presentación sobre el resto de los niveles a continuación.
Eric King
8

De la capa modelo.

Para ser más precisos: de los servicios, que están contenidos en la capa del modelo , porque gobiernan la interacción entre los objetos de dominio y las abstracciones lógicas de almacenamiento.

El controlador solo debe ser responsable de cambiar el estado de la capa del modelo. Los DAO son parte del mecanismo de persistencia. Esto constituye una parte de la lógica de negocios y aplicaciones del dominio. Si comienza a interactuar con los DAO en el controlador, estaría filtrando la lógica del dominio en la capa de presentación .

mefisto
fuente
Para usar una capa de servicio, ¿debe ser un patrón DDD? corrígeme si me equivoco. ¿Tenemos capa de servicio en MVC?
Tu puedes tener. Los servicios se utilizan para separar la lógica del dominio de la lógica de la aplicación. Esto se hace necesario, luego pasa de estructuras de dominio CRUD puro (registro activo) a algo que separa la lógica de almacenamiento de la lógica de dominio. En la capa de modelo totalmente realizada, tiene 3 separaciones lógicas: persistencia, dominio y aplicación.
Mefisto
3

No estoy seguro de lo que exige el patrón MVC oficial, pero normalmente me gusta tener una capa de "servicio" entre los controladores y los DAO. El controlador extrae los datos de la solicitud y los pasa a la clase de servicio adecuada. La clase de servicio es responsable de llamar a uno o más DAO que devuelven clase (s) de modelo. Esas clases de modelo se envían de vuelta al controlador para que se envíen a la capa de vista. Poner la capa de servicio en ayuda con la reutilización ya que múltiples controladores pueden hacer uso de los mismos métodos de capa de servicio.

Shane
fuente