2013-07-14 2 views
2

Pensez à une simple opération d'insertion utilisateur. Mes classes liées au printemps pour faire ce travail sont UserController, UserService, UserServiceImpl, UserDAO, UserDAOImpl.Quelle est la meilleure pratique pour le modèle de service-dao?

Au niveau du contrôleur, j'appelle userService.insert(new User()) et dans la méthode userService.insert() j'appelle userDAO.insert(user). Je pense qu'il y a une duplication de méthode à ce modèle.

Existe-t-il un moyen d'éviter la duplication de méthode? Peut être mon codage est défectueux. J'attends vos réponses, expériences ...

Merci à l'avance ...

Répondre

0

ce que vous avez décrit l'air bien et se glisse beaucoup d'implémentations du modèle de services d'affaires. ce qui peut vous causer de la confusion, c'est que généralement le langage pour décrire la méthode/fonction diffère entre chaque couche. par exemple, 'insert' est un terme plus persistant de données, alors que la couche business/service veut "créer" un utilisateur. la raison pour laquelle la différence est là est habituellement une différence dans les concepts. "créer" un utilisateur à la couche de service est juste un 'objet', un 'utilisateur', alors que dans la couche DAO, il s'agit en réalité de quelques étapes; 1. créez le 'utilisateur', 2. créez leur 'adresse' dans un tableau différent, 3. ajoutez-les à n'importe quel groupe de sécurité.

Ainsi dans votre cas, vous pouvez réellement avoir un 1 à 1, dans de nombreux cas, les couches de gestion 1 équivaut à de nombreuses interactions DAO.

+0

oui à certaines méthodes de service il y a différentes étapes d'interaction OAC mais% 70 de mes méthodes de service ont juste une ligne quelque chose comme xDAO.saveOrUpdate() ou xDAO. delete(), etc ... Donc je me demande pourquoi je n'utilise pas directement les méthodes DAO à ces méthodes de service% 70. Qu'est-ce que tu penses? – user1153321

+0

l'exposition directe du DAO sous-jacent (disons, l'invocation directe du contrôleur) n'est pas nécessairement une mauvaise chose.Cela dépend de votre cas d'utilisation, de la complexité de l'application et de votre plan «futur». Personnellement, j'aime l'abstraction d'une couche de «service» au milieu car elle me donne la possibilité de «grandir» dans le futur (effectuer plus d'opérations que la simple DAO) et supporter la testabilité. Cela peut être aussi discutable que l'interface. > Argument d'implémentation, "si je ne fais jamais plus de x, pourquoi créer une interface?" –

1

Je pense que ce n'est pas une duplication, je pense que vous avez utilisé de très mauvais noms (qui font ressembler à une duplication).

La méthode de service "créer" un utilisateur, et la méthode DAO "insérer" ou "enregistrer". Et maintenant vous voyez que "créer" et "insérer" sont deux actions différentes, avec des portées différentes et un niveau d'abstraction différent. Donc, ce n'est pas une duplication.

+0

est le seul nom de problème des méthodes? Pensons à ceci ... l'entité X n'a ​​que 2 champs; id, nom et nous avons besoin de simples écrans CRUD. Au support, vous avez seulement besoin de sauvegarder, mettre à jour, supprimer, interroger l'entité X. A cet effet, si j'utilise XService et XDAO, XService ne fera qu'imiter/dupliquer les méthodes XDAO, n'est-ce pas? – user1153321

+0

le problème n'est pas le nom lui-même, le problème est ce que la méthode (s) fait: dans votre cas, la méthode de service créer une entité et la méthode DAO l'enregistrer - ce sont deux choses liées mais différentes. – Ralph

0

La structure que vous décrivez est, à part le nom de confusion mentionné, un bon point de départ. En fonction de la complexité, vous pouvez simplement laisser les classes d'interface dehors et vous vous retrouverez avec trois classes. Si votre application est petite (à moyen), je considère que c'est une approche légitime, même si ce n'est pas la meilleure pratique. Présentation d'une interface une fois que vous découvrez qu'il y a beaucoup de dépendances et vous avez besoin d'une sorte de package api pour une partie de votre application est facile à introduire avec le printemps tant que ce n'est pas l'application entière.

Une autre chose que vous devez garder à l'esprit est que vous n'avez pas besoin de multiplier cette chaîne complète de classes pour chaque cas d'utilisation. Un SimpleCrudDao généralisé et SimpleEntityService est parfaitement bien. Ensuite, une fois que SimpleEntityService n'est pas suffisant, vous pouvez commencer à créer des services spécifiques comme un UserService qui a des méthodes createUserAndTransferEntitiesAndUpdateWhatsoever.

+0

en fait j'utilise votre solution; Avec un SimpleEntityService je fais mes opérations CRUD simples au niveau du contrôleur et si j'ai besoin d'une solution n étape, je crée un service spécial. Je voulais juste être sûr que c'était légal :) Merci pour votre réponse. – user1153321

2

Pour mes projets, j'utilise ces couches de service et DAO. Je ne sais pas si c'est une bonne pratique ou non.

Ceci est un exemple de créer des niveaux de fonctionnement:

[View Layer] 
    * Simple HTML form or AJAX request 
     | 
     | User submits create form. Browser sends POST data 
     | to controller. 
     | 
[User Controller] 
    * Authentication and authorization. @Security annotations can be for method security. 
    * Controller tries to bind POST data to UserCreateForm. If can't Validation exception occurs. 
    * Validates bind data according to validation annotations. @Required ... 
     | 
     | (UserCreateForm) is POJO class which has validation annotations. 
     | It is similar but different from domain objects. 
     | 
[User Controller] 
    * Logs errors via Logging API (logback, slf4j, log4j ...) 
    * Copies form values from UserCreateForm to User domain object 
    * Calls service methods. 
    * Passes messages and model objects to desired view page. 
     | 
     | (User) is POJO class. called domain object, contains ORM annotations if using JPA 
     | or hibernate. It is similar but different from form/command objects. It can be 
     | generated automatically by tools (IDE, hibernate tools ...) 
     | 
[UserService & UserServiceImpl] 
    * Calls multiple DAO methods in one transaction. If an error occurs. rolls back. 
    * Contains business logic 
    * Doesn't know the database technology. 
     | 
     | (User) domain object. 
     | 
[UserDAO & HibernateUserDAOImpl || JpaUserDAOImpl || OracleJdbcDAOImpl ...] 
    * DAO layer knows the persistence technology 
    * Operations are atomic 
Questions connexes