Couche de Service et contrôleur: qui s'occupe de quoi?

En classe, nous apprenons maintenant à construire une application Spring, même si spring n'est pas directement impliqué, nous avons appris à créer les interfaces pour les objets DAO et service layer.

S'il vous Plaît corrigez-moi si je me trompe: La couche DAO est assez abstraite: elle ne contient que les opérations CRUD et est ensuite utilisée pour lire les données.(ie: obtenir tous les objets, obtenir des objets spécifiques, etc)

Couche de Service: contient des services pour créer des choses et supprimer des choses, c'est là que la logique métier devrait être.

Maintenant, tout cela a du sens dans la couche de service; sauf "mise à jour" des objets. Est-ce que vous venez de mettre une fonction "update" qui enregistre simplement l'objet dans votre base de données? Ou avez-vous besoin de définir la logique là? C'est là que ma confusion est car, ma compréhension est que les objets au printemps ne sont que ceux de POJO. maintenant, qui valide les données?

Disons que j'ai un objet " enfant" il a:Name, SurName, Gender, Photo, Birthdate Fields. comment nommerais-je les services? Ou voulez-vous tout simplement laissez le contrôleur s'occuper de la validation, ce qui ne me semble pas juste. D'un autre côté, il ne semble pas correct non plus de déléguer chaque setter qui doit être appelé à la couche de service.

Donc, fondamentalement: Aidez-moi à définir la sauvegarde de vos objets via la couche de service.

40
demandé sur sajjadG 2010-10-08 00:36:41

2 réponses

Si vous souhaitez que les contrôleurs puissent persister les modifications apportées à un objet Child, Vous auriez traditionnellement une méthode dans le service nommée quelque chose comme ChildService.update(Child newchild), qui gérera l'appel des Dao corrects pour persister la nouvelle version de cet enfant.

Les contrôleurs sont libres de demander au service un enfant, de modifier les champs (en fonction de certaines entrées de l'utilisateur) - une conception saine obligerait le contrôleur à travailler avec le POJO enfant, puis à demander au Service de persister le changement. Le modèle POJO ne devrait rien savoir sur un contrôleur, un service ou un DAO, mais simplement contenir des données comme vous le suggérez - vous ne voudriez certainement pas que chaque appel à setName() ou setGender() entraîne automatiquement une mise à jour de base de données.

Au lieu de cela, le contrôleur et/ou le service doivent acquérir un objet Child, faire tout le travail dont il a besoin pour l'objet dans son unité de travail, puis demander à un Service (puis au DAO) de persister les changements.

La Validation peut avoir lieu dans plusieurs couches - le contrôleur peut vouloir valider toute entrée de l'utilisateur web, et le Service peut vouloir valider qu'il a un objet Child valide avant qu'il ne le persiste. Il est particulièrement logique d'avoir un certain niveau de validation dans les deux couches au cas où vous souhaiteriez réutiliser ce Service dans d'autres capacités-comme exposer une interface REST, un frontal différent, etc.

22
répondu matt b 2010-10-07 20:45:22

Généralement, un service Spring est transactionnel. Les choses vont dans une méthode de service particulière parce qu'elles doivent être regroupées dans la même transaction. Si vous voulez récupérer un objet de la base de données, le tourner et enregistrer la nouvelle version, la récupération et l'enregistrement doivent être dans la même méthode de service. Ainsi, vos méthodes de service sont déterminées en fonction de ce que vous devez faire l'application pour l'utilisateur.

J'essaie de restreindre les contrôleurs à faire du travail lié à la validation paramètres http, décider quelle méthode de service appeler avec quels paramètres, quoi mettre dans le httpsession ou la requête, quelle vue rediriger ou transférer, ou des choses similaires liées au web.

En ce qui concerne la validation: valider les paramètres d'entrée dans le contrôleur est une bonne chose pour s'assurer que personne ne peut casser votre application avec des entrées fausses. La Validation dans le contrôleur tend à s'assurer que les entrées sont syntaxiquement correctes (y compris la détection des attaques par injection) tout en la validation au niveau du service consiste à s'assurer que l'état des choses dans la base de données est ce que vous attendez d'elle.

Donc, les contrôleurs contiennent du code d'infrastructure web-framework, les services contiennent du code logique d'application.

39
répondu Nathan Hughes 2013-08-24 19:28:31