web-dev-qa-db-fra.com

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

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

Veuillez me corriger si je me trompe: la couche DAO est assez abstraite: elle contient juste les opérations CRUD et est ensuite utilisée pour lire les données (par exemple: obtenir tous les objets, obtenir des objets spécifiques, etc.)

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

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

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

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

47
toomuchcs

Si vous souhaitez que les contrôleurs soient en mesure de conserver les modifications apportées à un objet Child, vous disposerez traditionnellement d'une méthode dans le service nommée quelque chose comme ChildService.update(Child newchild), qui gérera l'appel des bons DAO à persistez la nouvelle version de cet enfant.

Les contrôleurs sont libres de demander le service pour un enfant, de changer les champs autour (en théorie sur la base de certaines entrées utilisateur) - une conception saine aurait le contrôleur faire un certain travail 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 il suffit de conserver les données comme vous le suggérez - vous ne voudriez certainement pas que chaque appel à setName() ou setGender() se traduise automatiquement par une mise à jour de la base de données.

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

La validation peut avoir lieu en plusieurs couches - le contrôleur peut vouloir valider n'importe quelle entrée de l'internaute, 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 voudriez réutiliser ce service dans d'autres capacités - comme exposer une interface REST, un frontal différent, etc. .

29
matt b

Généralement, un service Spring est transactionnel. Les choses entrent dans une méthode de service particulière car elles doivent être regroupées dans la même transaction. Si vous souhaitez récupérer un objet de la base de données, le tordre et enregistrer la nouvelle version, la récupération et la sauvegarde doivent se faire dans la même méthode de service. Vos méthodes de service sont donc déterminées en fonction de ce que l'application doit faire pour l'utilisateur.

J'essaie de restreindre les contrôleurs à effectuer des travaux liés à la validation des paramètres http, à décider quelle méthode de service appeler avec quels paramètres, quoi mettre dans la httpsession ou demande, quelle vue rediriger ou transférer, ou des choses similaires liées au Web.

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

Les contrôleurs contiennent donc du code d'infrastructure de structure Web, les services contiennent du code logique d'application.

45
Nathan Hughes