Je construis une application web qui constitue principalement des opérations CRUD de données à partir de back-end/base de données. Il y a des cas où je dois écrire une logique d'entreprise (je suis certain que nous aurons plus de logique métier à mesure que nous approfondirons le développement). Actuellement, pour chaque écran d'IU que je crée, je crée une classe de modèle, une classe de service, une classe DAO, un contrôleur (c'est essentiellement une servlet) et un tas de pages jsp. Dans la plupart des cas, la classe de service appelle simplement les méthodes de DAO pour passer dans les objets de modèle. Essentiellement, nous utilisons des classes de modèles pour cartographier les données à partir des écrans de l'interface utilisateur. Par conséquent, le contrôleur aura les objets du modèle remplis lors de la soumission d'un formulaire. J'ai commencé à utiliser des classes de service pour conserver une couche de séparation de la couche Web à la couche DAO. Mais parfois, je pense que la classe de service est en train d'ajouter un niveau inutile d'appels d'API, je pense que je pourrais juste injecter le DAO dans Controller et terminer la tâche plus rapidement. Je souhaite utiliser la classe de service uniquement lorsqu'il existe une logique métier supplémentaire à exécuter. Si vous devez concevoir une application, quels sont les facteurs que vous considérez utiliser contrôleur-> DAO vs contrôleur-> Service-> flux de contrôle DAO?Utilisation des services et des DAO dans le contrôleur de mvc de printemps
Répondre
Les DAO sont plus granulaires et traitent d'une entité spécifique. Les services fournissent des fonctionnalités de niveau macro et peuvent utiliser plusieurs DAO. Généralement, les services sont utilisés pour définir des limites de transaction pour gagner de l'atomicité. En d'autres termes, si vous finissez la mise à jour de plusieurs tables à l'aide de plusieurs DAO, la définition de la limite de transaction au niveau du service vous aidera à valider ou annuler toutes les modifications apportées à la base de données.
Dans votre conception, puisque vous faites principalement CRUD pour diverses entités, il peut sembler que les services n'ajoutent pas beaucoup de valeur. Cependant, pensez à un frontal Web comme un moyen de mettre à jour les données. L'utilisation de services vous permettra d'exposer ultérieurement les mêmes fonctionnalités qu'un service Web à d'autres formes de clients comme des intégrateurs tiers, etc.
Donc, en résumé, votre conception semble être conforme aux pratiques conventionnelles. Si vous pensez que vous pouvez combiner plusieurs services en un en fonction d'un thème commun de sorte qu'il peut réduire les frais généraux de code, alors, vous devriez aller de l'avant et le faire. À la fin de la journée, le but ultime est de créer un code maintenable que personne n'a peur de changer en cas de besoin.
"Utilisation des services" vous n'avez pas besoin d'une classe de service pour renvoyer une liste simple/effectuer un traitement grossier ou exposer comme une api reposante. Vous avez besoin de classes de service serpate lorsque vous manipulez plusieurs entités en interaction. – NimChimpsky
Vous aurez également besoin de services pour les applications externes. Imaginez que vous ayez un service Web qui fournit des données pour une application Android. Vous pouvez créer une couche Service qui obtiendra les données et retournera les objets DTO (Data Transfer Objects) pour une couche Adapter qui gère les requêtes REST et transforme les DTO en JSON ou XML pour les envoyer à l'application Android. – dgimenes
Je référencer ma réponse here
La longue et courte, il est l'avantage d'utiliser une couche de service est-il vous donne de la place pour se déplacer à l'avenir si vous voulez faire quoi que ce soit avec la sécurité du printemps et les rôles etc. Il vous permet de gérer les transactions plus atomiquement et Spring lui-même a de très bonnes annotations pour cela.
Ensuite, vous devez passer par la peine de décoder vos préoccupations DAO de vos contrôleurs. Si vos contrôleurs sont fortement liés à vos DAO, c'est plus de travail dans le futur si vous n'avez pas déjà construit une couche de service. – david99world
Parce que le service devrait fournir une séparation des préoccupations http://en.wikipedia.org/wiki/Separation_of_concerns. Ce serait une mauvaise pratique d'ignorer cette façade de service et d'aller directement au DAO du contrôleur si vous avez introduit une couche de service. Bien qu'au départ vous rompiez la règle DRY en n'ayant pas besoin d'une couche de service au départ, le fait que ce soit SoC serait plus pénible à l'avenir pour tout refactoring. – david99world
Je vais juste laisser ceci ici http://stackoverflow.com/questions/3688664/simple-spring-app-why-use-service-layer#answer-3688779 car cela résume mon raisonnement de pourquoi avoir un couche de service pour une application qui peut augmenter en complexité est une bonne idée. – david99world
Utilisez une classe de service pour plus d'un aggregate root.
Injectez les dépôts (alias dao qui retourne une collection) ou dao directement dans le contrôleur, pas besoin d'une couche/classe supplémentaire pour faire un get basique. N'utilisez les classes de service que si nécessaire, sinon vous avez deux fois plus de code que nécessaire.
Vous pouvez rendre le référentiel générique, et annoter avec @Transactional(propagation = Propagation.REQUIRED)
qui impose une transaction est présent, mais n'en créera pas un nouveau s'il est déjà présent. Donc, si vous utilisez plus tard plusieurs repositos dans une méthode de classe de service, vous n'aurez qu'une seule transaction.
Dans le livre Pro-Printemps-3, ils mentionnés ci-dessous ligne, pour le contrôleur avec JPA2
Once the EntityManagerFactory had been properly configured, injecting it into your service layer classes is very simple.
et ils utilisent la même classe que le service et le dépôt comme ci-dessous:
package com.apress.prospring3.ch10.service.jpa;
// Import statements omitted
@Service("jpaContactService")
@Repository
@Transactional
public class ContactServiceImpl implements ContactService {
private Log log = LogFactory.getLog(ContactServiceImpl.class);
@PersistenceContext
private EntityManager em;
// Other code omitted
}
mais dans le cas où vous allez utiliser CRUDRepository ou JPARepository, alors votre DAO sera Interface et vous devrez créer une couche de service pour gérer votre code
- 1. Utilisation des transactions dans DAO
- 2. Utilisation de DAO géré par Spring sans contrôleur?
- 3. Utilisation d'interfaces pour écrire des classes DAO
- 4. Webservice Java: utilisation des gestionnaires MVC ou DAO +
- 5. Consommez Xml Utilisation des services Web de printemps
- 6. Numéro de contrôleur mvc printemps
- 7. Printemps DM et Registre des services
- 8. problème au printemps services REST mvc
- 9. Génération DAO utilisant le printemps roo
- 10. Printemps MVC 3.1 Contrôleur RESTful
- 11. Utilisation de la vitesse avec des carreaux et le printemps
- 12. Printemps MVC - @Controller annotation et le traitement des demandes concurrentes
- 13. Utilisation des services de domaine
- 14. Utilisation des identificateurs comme tableaux et envoi au contrôleur MVC
- 15. Utilisation des services Web SOAP comme modèle dans ASP.NET MVC
- 16. trouver/créer un outil pour générer des sources java (model/controller/dao) au printemps mvc
- 17. Un bon schéma de dénomination pour les services et DAO
- 18. Utilisation des méthodes d'un DAO dans un autre
- 19. Contrôleur annoté MVC de printemps non trouvé
- 20. Utilisation des services Web
- 21. utilisation de printemps des messages typeMismatch
- 22. Spring MVC Meilleures pratiques Gestion des exceptions irrécupérables dans le contrôleur
- 23. MVC DDD: Est-il acceptable d'utiliser des dépôts avec des services dans le contrôleur?
- 24. Portée de printemps et de haricot, les services devraient être singletons et dao devrait être par demande?
- 25. Gestion des exceptions au printemps mvc
- 26. injectent la couche de services multiples DAO dans la pratique
- 27. Utilisation des composants AXSLT dans Spring MVC
- 28. Défi de mappage des requêtes MVC de printemps
- 29. Printemps MVC et @Async
- 30. Printemps DAO transactionnel, exceptions avalées
Je suis entré dans un projet déjà existant lorsque j'ai commencé mon travail actuel. Je suis ici depuis un peu plus d'un an. Honnêtement, je viens de réaliser qu'il y a une couche distincte pour injecter DAO. Le projet au travail les injecte juste dans les contrôleurs. Maintenant que je le sais, et que je suis prêt à parler de l'avantage de l'atomicité, je pense qu'il aurait été bon d'avoir une couche de service, car nous avons plusieurs entités en interaction dans l'application. – theblang