web-dev-qa-db-fra.com

Dans MVC, DAO doit être appelé à partir du contrôleur ou du modèle

J'ai vu divers arguments contre le DAO appelé directement à partir de la classe Controller et également le DAO à partir de la classe Model.En fait, je pense personnellement que si nous suivons le modèle MVC, le contrôleur ne devrait pas être couplé au DAO, mais à la classe Model devrait invoquer le DAO de l'intérieur et le contrôleur devrait invoquer la classe de modèle. Pourquoi, nous pouvons découpler la classe de modèle en dehors d'une application Web et exposer les fonctionnalités de différentes manières, comme pour un service REST à utiliser notre classe modèle.

Si nous écrivons l'invocation DAO dans le contrôleur, il ne serait pas possible pour un service REST de réutiliser la fonctionnalité à droite? J'ai résumé les deux approches ci-dessous.

Approche n ° 1

  public class CustomerController extends HttpServlet {

    proctected void doPost(....)  {

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

    }


 }

Approche 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);

   }

}

Remarque -

Voici ce qu'est une définition du modèle:

Modèle: le modèle gère le comportement et les données du domaine d'application, répond aux demandes d'informations sur son état (généralement à partir de la vue) et répond aux instructions de changement d'état (généralement à partir du contrôleur).

Dans les systèmes événementiels, le modèle avertit les observateurs (généralement des vues) lorsque les informations changent afin qu'ils puissent réagir.

J'aurais besoin d'un avis d'expert à ce sujet car j'en trouve beaucoup en utilisant # 1 ou # 2, alors lequel est-ce?

14
user65878

À mon avis, vous devez faire la distinction entre le modèle MVC et l'architecture à 3 niveaux. Pour résumer:

Architecture à 3 niveaux:

  • données: données persistantes;
  • service: partie logique de l'application;
  • présentation: hmi, webservice ...

Le modèle MVC a lieu dans le niveau de présentation de l'architecture ci-dessus (pour une webapp):

  • les données: ...;
  • un service: ...;
  • présentation:
    • contrôleur: intercepte la requête HTTP et retourne la réponse HTTP;
    • modèle: stocke les données à afficher/traiter;
    • vue: organise la sortie/l'affichage.

Cycle de vie d'une typique requête HTTP:

  1. L'utilisateur envoie la requête HTTP;
  2. Le contrôleur l'intercepte;
  3. Le contrôleur appelle le service approprié;
  4. Le service appelle le dao approprié, qui renvoie certaines données persistantes (par exemple);
  5. Le service traite les données et renvoie les données au contrôleur;
  6. Le contrôleur stocke les données dans le modèle approprié et appelle la vue appropriée;
  7. La vue obtient instanciée avec les données du modèle et est renvoyée comme réponse HTTP.
31
sp00m

De la couche modèle.

Pour être plus précis: à partir des services, qui sont contenus dans couche modèle, car ils régissent l'interaction entre les objets de domaine et les abstractions de la logique de stockage.

Le contrôleur ne devrait être responsable que de la modification de l'état de la couche modèle. Les DAO font partie du mécanisme de persistance. Cela fait partie de la logique métier et applicative du domaine. Si vous commencez à interagir avec les DAO dans le contrôleur, vous fuiriez la logique du domaine dans couche de présentation.

8
mefisto

Je ne sais pas ce que le modèle MVC officiel appelle, mais j'aime normalement avoir une couche "service" entre les contrôleurs et les DAO. Le contrôleur extrait les données de la demande et les transmet à la classe de service appropriée. La classe de service est chargée d'appeler un ou plusieurs DAO qui retransmettent les classes de modèle. Ces classes de modèle sont ensuite renvoyées au contrôleur afin d'être envoyées à la couche de vue. L'intégration de la couche de service facilite la réutilisation, car plusieurs contrôleurs peuvent utiliser les mêmes méthodes de couche de service.

3
Shane