Couche de service vs DAO - Pourquoi les deux?

64

Je travaille avec SpringMVC, Hibernate et certaines bases de données dans un exemple d'application Web java.

Il en existe quelques-uns différents, mais ce tutoriel d'intégration Spring 3 et hibernate avec cet exemple contient une classe de modèle, une vue (en jsp) et un service et des classes de données pour le contrôleur.

Ma question est la suivante: les classes service et DAO ne font-elles pas la même chose? Pourquoi auriez-vous besoin des deux?

C'était le tutoriel que j'utilisais réellement: http://fruzenshtein.com/spring-mvc-security-mysql-hibernate/

Jeff
la source

Réponses:

60

En règle générale, le DAO est aussi léger que possible et existe uniquement pour fournir une connexion à la base de données. Parfois, il est résumé afin que différentes bases de données puissent être utilisées.

La couche de service est là pour fournir une logique permettant d’exploiter les données envoyées vers et depuis le DAO et le client. Très souvent, ces 2 éléments seront regroupés dans le même module, et parfois dans le même code, mais vous les verrez toujours comme des entités logiques distinctes.

Une autre raison est la sécurité: si vous fournissez une couche de service sans relation avec la base de données, l'accès au client de la base de données est plus difficile, sauf via le service. Si la base de données n’est pas accessible directement à partir du client (et qu’il n’existe aucun module DAO trivial agissant en tant que service), tout attaquant ayant pris le contrôle du client peut tenter de pirater également la couche service avant d’obtenir la totalité des informations. accès le plus désinfecté à vos données.

gbjbaanb
la source
1
Je suis d'accord avec la séparation des couches service et dao et de votre couche service contenant votre logique métier.
Peter Delaney
sans oublier qu'un service peut appeler plusieurs DAO, par exemple lors de la sauvegarde d'un utilisateur, vous pouvez parler à UserDao, UserOrdersDao, etc. Ou devrions-nous créer un service pour chaque? Et ensuite, qui pourrait appeler tous ces services?
Fermin Silva
40

Je suis l'auteur du post en question. J'ai eu ma part de travail sur différentes technologies et différentes architectures. Sur la base de ce qui précède, je peux affirmer sans crainte qu’il est toujours bon d’avoir une couche service et une couche dao. DAO devrait être limité à l'ajout, à la mise à jour, à l'insertion et à la sélection d'objets Entity dans / à partir de la base de données, et c'est tout. Si vous voulez faire quelque chose de plus en termes de logique, ajoutez-le à la couche service. Cela aidera à rendre le code modulaire et facilement remplaçable lorsque la base de données est remplacée (pour une partie des données). Ceci est particulièrement applicable dans les applications impliquant des rapports ayant une logique lourde même après avoir récupéré les données de la base de données.

De plus, au printemps, la sécurité s’applique idéalement au niveau de la couche service. Vous ne voudriez pas changer de cette façon.

lokesh
la source
5
Merci beaucoup d'avoir répondu à ma question. c'est dédicace à votre blog! Merci pour le bon exemple, continuez à écrire.
Jeff
Cela me tracassait la tête pendant un certain temps et je pense que l'expérience aide le plus dans ces situations. Je vous remercie.
Utku Özdemir
Je suis d'accord avec la séparation des couches service et dao et votre couche service contenant votre logique métier et n'appellerais que les méthodes Dao. Qu'en est-il lorsqu'une de mes méthodes de service doit appeler une autre méthode de service. Devrais-je avoir une autre abstraction au-dessus de la couche service qui appelle plusieurs méthodes de service?
Peter Delaney
Non. Les classes de la couche service peuvent avoir une référence les unes aux autres (si nécessaire) et appeler les méthodes requises.
Lokesh
11

Adam Bien souligne dans son livre que JPA EntityManager est une bonne implémentation universelle de la DAO:

http://realworldpatterns.com/

Dans le monde Java EE, il n'est presque jamais nécessaire d'écrire votre propre DAO car les implémentations JPA en incluent une. Vous devez seulement écrire la couche de service.

L'implémentation de votre propre couche DAO est en réalité une survivance de la très mauvaise architecture J2EE d'il y a 15 ans, mais de nombreuses personnes se sentent toujours obligées de le faire. Ces couches DAO personnalisées ne fournissent souvent rien de plus que des fonctions de transfert qui appellent la méthode correspondante sur EntityManager.

Donc, pour répondre à votre question, oui, vous avez besoin d’une couche service et d’un DAO, mais vous n’avez qu’à écrire la couche service.

Dean Schulze
la source
2
Je ne sais pas si cela s'applique à Spring - il existe toujours un DAO personnalisé à créer pour le modèle. Peut-être que votre déclaration "il n’est presque jamais nécessaire d’écrire votre propre DAO" s’applique spécifiquement aux conteneurs EJB / au serveur d’application?
Don Cheadle
1
Il est préférable d’écrire votre propre (DAO / DAOImpl), bien qu’il mappe uniquement à EntityManager - C’est parce qu’à l’avenir, vous pourrez ajouter une autre implémentation DAO sans avoir à modifier le code de la couche de service .
ahmednabil88
@YajliMaclo quelle est la différence quoi changer?
Alex78191
4

Je mets généralement tout le code spécifique à la base de données (requêtes) dans les DAO ainsi que le traitement des transactions et la logique commerciale dans les services. Cela permet aux méthodes de service d'appeler des méthodes sur plusieurs DAO et de tout conserver au sein d'une même transaction. À mon avis, cela permet une meilleure réutilisation du code sur dao.

Sbrattla
la source
2

J'ai constaté que la couche de service ajoute une complexité inutile dans la plupart des cas. En théorie, il faut éviter de laisser des entreprises logiques dans la couche dao, mais à la fin, cela crée de la confusion, même certaines personnes n’ont plus l’intention de supprimer complètement la couche dao car elles estiment qu’elle n’ajoute aucune valeur. http://ayende.com/blog/4784/architecting-in-the-pit-of-doom-the-evils-of-the-repository-abstraction-layer

Mais si vous avez plusieurs logiques d’affaires, alors oui, c’est une bonne idée. Est-il essentiel de créer une couche de service?

Jésus
la source
3
J'ai lu le billet de blog d'Ayende à plusieurs reprises maintenant, et je ne peux absolument pas m'empêcher de penser que sa conception (sur laquelle j'aurais été d'accord à un moment donné), tout en restant fidèle à l'esprit de YAGNI, coûterait presque inévitablement plus de temps de développement, même en moyen terme qu'il en coûterait pour mettre en place l’abstraction de couches en premier lieu. Je me demande s’il a changé d’opinion sur le couplage étroit qui existe entre l’application entière et NHibernate, alors qu’il est encore plus courant qu’une seule application interroge plusieurs sources de données SQL, NoSQL et API.
M. Cochese
@ LennyGodber oui, je sais que vous pensez qu'OMI est préférable d'avoir la couche DAO / repository car elle présente plus d'avantages que d'inconvénients car, comme vous le disiez, il est très courant d'avoir plusieurs sources de données
Jesus
-1

IMHO la couche Service peut être considérée comme une couche entre le contrôleur et la couche DAO. Cette couche de service est l'endroit où nous pouvons ajouter une logique métier et même créer un objet de retour spécifique à ce qui doit être rendu par la vue.

compserve23
la source