2010-06-29 14 views
7

Je me sens un peu en conflit en ce moment. J'ai une application web utilisant Stripes pour un framework MVC et Spring/Hibernate pour le back-end. J'ai une méthode d'enregistrement de compte dans ma couche MVC qui nécessite la validation suivante:Dois-je dupliquer la validation dans ma couche MVC et dans la couche Service?

  • Nom d'utilisateur est pas déjà pris
  • L'adresse e-mail fournie n'est pas déjà associé à un autre compte

J'ai méthode de validation dans Stripes (couche MVC) qui vérifie ces deux cas, mais se demandait si ma couche de service devrait dupliquer ces contrôles? Si l'interface de la couche de service a été exposée en tant que service Web, je pense que la validation serait une bonne idée, mais si elle n'est utilisée que dans le contexte d'une application Web, est-ce nécessaire? Edit: Je n'ai pas l'intention de dupliquer le code de validation - je veux dire dupliquer les appels de méthode de validation à deux endroits.

Je vois mes options:

  1. Dupliquer les appels de validation dans les deux MVC et couche de service
  2. uniquement effectuer cette validation dans la couche MVC
  3. uniquement effectuer cette validation dans la couche de service.

Quelle est la meilleure pratique ici? Je suis à la recherche de conseils/opinions sur quelle option je devrais aller avec et pourquoi. Notez qu'il existe des contrôles de validation simples sur les champs d'entrée du formulaire d'inscription (comme la vérification des blancs) et que je pense que ceux-ci devraient être traités par la validation MVC seulement; Je suis seulement préoccupé par des validations plus complexes.

Répondre

1

Annie,

Bonne question, je me suis posé la même à plusieurs reprises. Voici ce que j'ai fini avec (jusqu'à maintenant).

L'approche la plus pure (mais fastidieuse) consiste à invoquer la logique de validation dans les deux couches. l'approche pragmatique pourrait être de ne l'invoquer qu'en Web-Land (par exemple vos contrôleurs).

Je pense qu'il n'y a pas de réponse qui met fin à toute discussion. Je pense que cela dépend du contexte de votre projet. Si la taille du projet est modeste (en termes de personnes et de taille de base de code) et vous êtes sûr que pas beaucoup de code sera développé par d'autres qui invoquent votre API de service (dans une mesure que vous ne serez pas en mesure de superviser), puis effectuer la validation dans la couche Web peut suffire.

Toutefois, si vous prévoyez de nombreux clients, vous pouvez avoir besoin d'une sécurité de niveau supérieur. Quand je parle de sécurité ici, je parle de niveau de cohérence - des garanties dont vous avez besoin. Si ce niveau est élevé, il n'y a aucun moyen de contourner le problème: vous devrez le faire à la fois pour le service (pour la sécurité) et la couche Web (principalement pour offrir aux utilisateurs une expérience acceptable). Donc, le facteur clé ici est la sécurité et la quantité dont vous avez réellement besoin. Si vous avez besoin de beaucoup, vous optez pour l'approche «puriste». Si votre demande ne prend pas exactement des décisions qui concernent des questions de vie ou de mort, vous optez pour l'approche pragmatique.

5

Ne dupliquez pas de code. Utilisez JSR303 Bean Validation pour pouvoir utiliser la même logique de validation dans toutes les couches de votre application. (Un projet distinct de la routine ORM Hibernate) fournit l'implémentation de référence de cette interface. Il est mort simple à utiliser, vous pouvez get started with it very quickly.

+0

Oui, je ne veux pas dire que je vais dupliquer le code de validation - je veux dire que je vais appeler le même code de validation en deux endroits – JMM

+0

Comme vous l'avez mentionné, vous avez vraiment besoin de valider deux fois Si vous avez d'autres clients en plus de la couche du contrôleur. Potentiellement, je pourrais voir potentiellement vouloir avoir une logique de validation différente aussi –

1
  1. Idéalement, faire la validation dans les deux couches, puisque votre couche de service peut être utilisé avec un client autre que la couche mvc actuelle

  2. réutiliser le mécanisme de validation à deux endroits (validation Bean, par exemple)

3

À mon avis, vous devriez diferenciate deux types de validations:

  • La validation des données de format: qui doit être validée dans la couche de présentation (MVC dans votre cas). Normalement, les deux dans le client et le côté serveur
  • La validation des données Bussines: qui devrait être validé dans la couche de service

Dans votre cas validateurs sont liés aux règles métier, donc je vais les mettre seulement dans la couche de service. En outre, si vous dupliquez vos validations dans les deux couches, vous effectuerez deux fois les mêmes requêtes, ce qui ralentira les performances de votre application.