2010-09-19 9 views
9

Chaque fois que je commence à travailler sur une nouvelle application Web ASP.NET MVC, je ne suis pas sûr d'utiliser ou non la validation DataAnnotations. Quelque chose à ce sujet se sent mal.DataAnnotations ou de valider manuellement dans les services?

Par exemple, supposons que j'ai un UserService qui est passé un CreateUserModel de l'action Create du AccountController. Pour que l'utilisateur fournisse toujours un nom, définissez la propriété Name du modèle sur l'attribut [Required]. Je suis maintenant sûr que le classeur modèle ne me donnera jamais un CreateUserModel sauf s'il a un nom.

Mon problème est que pour mon UserService être un composant réutilisable de mon système, il ne peut pas compter sur le fait que la couche ci-dessus fournit des données valides, et sûrement doit également valider ces données. Le besoin de ceci est accentué plus loin quand vous considérez que vous pouvez vouloir écrire un service Web qui réutilise complètement le UserService (et n'a pas le classeur modèle pour faire toute la validation d'annotation de données pour cela). Donc, ma question est la suivante: Quelle est la meilleure pratique pour cette situation? Valider avec des annotations de données et répéter cette validation dans les services? Valider uniquement dans les services et lancer des exceptions? Un mélange des deux? J'espère que ma question n'est pas trop subjective, j'essaie principalement d'établir un consensus sur si le déplacement de la validation aux annotations de données va finir par me mordre à la fin.

Répondre

1

Vous avez raison, vous devez désactiver la validation sur le contrôleur et valider dans la couche de service. Vous pouvez toujours utiliser DataAnnotations si vous le souhaitez. La couche de service peut lancer une exception avec les messages de validation, le contrôleur peut intercepter cette exception et ajouter les messages de validation à ModelState. Vous pouvez éviter cela pour chaque action en gérant l'exception de validation sur la méthode OnException du contrôleur.

1

Personnellement, cela ne me dérangerait pas que les choses soient validées deux fois, tant que la logique est définie en un seul endroit, ce qui est clairement le cas dans votre situation. Je ne suis pas suffisamment expérimenté pour en dire plus sur MVC, mais je peux imaginer que lancer des exceptions à partir de la couche de service ne donnera pas une expérience utilisateur (UX) aussi bonne que ce que MVC peut vous donner lors de la validation instance affiche un message d'erreur à côté de la zone de texte qui est invalide, ce qui est beaucoup plus difficile lorsque vous lancez des exceptions à partir de votre couche de service). Lorsque l'UX est la même, effectuez votre validation uniquement dans le service, sinon faites-le dans les deux couches.

6

J'effectue toute ma validation dans la couche de service, en utilisant une combinaison de validations manuelles (si x == y) et en utilisant des annotations de données. Pour utiliser les annotations de données dans votre couche de service, vous devez utiliser manuellement la classe Validator à l'aide de la méthode TryValidateObject(). Un bon exemple de ceci peut être vu here.

Vous devez ensuite transmettre vos erreurs de validation de votre couche de service à votre contrôleur et demander à votre contrôleur d'ajouter chaque erreur à la liste des erreurs d'état du modèle.

+1

C'est ce que nous faisons, sauf que nous passons un IValidationDictionary à la couche sevice qui est implémentée en tant qu'enveloppeuse ModelState afin que la couche de service puisse ajouter directement des erreurs à ModelState sans dépendre de ASP.NET MVC. Le contrôleur n'a donc pas besoin de gérer l'ajout d'erreurs renvoyées à ModelState. –