12
votes

Les annotations de données sont-elles vraiment une bonne idée de validation?

Comme j'apprends de plus en plus sur ASP.NET MVC, plus je suis introduit aux annotations de données.
Spécifiquement en MVC, ils sont utilisés pour la validation et cela me donne des préoccupations.
Le plus grand est due au fait que j'aime garder mon modèle en tant que Pocos et aussi propre que possible.
Maintenant, et si j'ai ces classes de modèle partagées sur plusieurs projets dans une solution (c'est-à-dire la touche Web Front End, application de bureau, Services Web)?
Fondamentalement, je suis préoccupé par le fait que des annotations spécifiques à mon application frontale MVC puissent influencer certains autres projets tels que des données dynamiques, etc. J'ai déjà des objets d'affaires séparés de mon modèle de base de données (dans ce cas LINQ2SQL), donc je ne m'inquiète donc pas des annotations ayant une influence sur mon dal, mais je me demande si ma peur d'autres projets est légitime.

Aussi, je pense que la liaison d'un message d'erreur requise sur votre modèle est un peu folle.

Je suppose que le problème serait résolu si j'ai créé des modèles distincts pour chaque projet (Web, bureau, service Web, etc.), mais cela serait pratiquement une copie directe de mon modèle actuellement partagé. Est-ce le bon chemin?
Cela aurait un impact important sur ma solution (beaucoup de cartographie d'un modèle à un autre se produire).

Que pensez-vous?
J'aimerais entendre ce que vous considérez comme une bonne et une mauvaise utilisation des annotations de données.


0 commentaires

7 Réponses :


3
votes

vraiment, vraiment bonne question. Surtout que tous les applications de démonstration brillante sont construites autour des données de basenotation manipulant toute la validation car c'est un point de vente aussi agréable et brillant. Et qui aime faire de la validation de toute façon?

Je pense que le meilleur moyen de regarder en fonction de cela est qu'ils devraient faire partie d'une solution de validation plus complète, tant pour les raisons structurelles que vous mentionnez, ainsi que leurs limitations - comment validez-vous des choses comme "est ce nom d'utilisateur unique ? " ou "Ce gestionnaire est-il autorisé à attribuer cette tâche à cet employé?" en utilisant des annotations de données?


2 commentaires

Je sais que c'est une réponse de 5 ans, mais pouvez-vous s'il vous plaît me signaler dans la bonne direction? Ce que vous avez dit a beaucoup de sens, vous ne pouvez pas tout faire avec des annotations de données.


@DPP - Ouais, cela a été un moment depuis que j'ai construit beaucoup de grande validation, et dans ces années que les daNaNotations ont un peu mieux et que d'autres outils ont également un peu mieux. Quoi qu'il en soit, la façon dont nous nous sommes approchés consistait à construire un pipeline de validation à 2 phases. La première était une méthode basée sur des produits de base pour vérifier les éléments que vous pouvez faire en mémoire sur un seul objet. La deuxième phase était une solution injectée de dépendance susceptible de connecter la validation avec la base de données pour rechercher des choses comme l'unicité et d'autres constructeurs qui nécessitaient des requêtes. Aujourd'hui, j'utiliserais probablement simplement la flueuretvalidation comme colle ici.



3
votes

Les donnéesAnnotations ne sont pas la seule méthode disponible pour la validation et vous pouvez utiliser plusieurs méthodes de validation. La plupart des validations que j'ai constatées lors de l'utilisation de produitsAnnotations sont spécifiquement pour la validation des données qui vont dans la base de données. Tels que maxlength () et gamme ().

IDALIDATILABLEOBJECT est le plus flexible que j'ai vu quand il s'agit d'écrire vos propres validations. Cependant, cela n'aide pas votre exemple spécifique d'avoir un seul référentiel qui tiendrait tous vos objets. Mais pas de peur!

idataerrrorinfo est un autre moyen de valider les données et celle-ci peut être utilisée seule dans votre application MVC et ne toucherait pas d'autres projets.

Si une classe implémente l'interface IDATAERRORINFO, le framework ASP.NET MVC utilisera cette interface lors de la création d'une instance de la classe. Ainsi, vous pouvez séparer votre validation à l'aide d'une interface de localisation de service ou de quelque chose de similaire.

Je trouve ivenidaTableObject comme une meilleure implémentation, cependant.


0 commentaires

0
votes

Vous ne savez pas si les donnéesAnnotations vont gâcher vos autres projets, mais ils sont attendus qu'ils ignorent les donnéesAnotations à moins que vous ne créiez des classes pour les vérifier.

À propos de garder votre poco aussi simple que possible que possible, l'intention des produits de données est de conserver des métadonnées et des données au même endroit (c'est-à-dire si elle est nécessaire que _unitsinStock doit toujours être un entier positif, cette exigence est liée à la définition de données de " unités en stock "et convient parfaitement à la définition du modèle). Cela aide également à éviter des erreurs, car il ne s'agit que d'où vous utilisez la validation (dans un projet MVC), les règles seront toujours les mêmes (vous ne pouvez donc pas oublier de vérifier une variable pour une valeur minimale dans la page A pendant votre chèque. il dans la page b). Les messages d'erreur ne sont pas requis, mais vous pouvez l'utiliser pour afficher un message plus sympathique, et ce message d'erreur sera affiché partout.

Il facilite également la mise en œuvre de la validation automatisée du serveur et du client (MVC).

En revanche, malgré vous avoir la possibilité de créer des attributs personnalisés pour vérifier les règles d'entreprise, elle nécessite plus de connaissances et de patience que d'utiliser une "classe d'affaires" (si vous n'êtes pas habitué à cela), et aussi loin que moi Sachez, il est seulement officiellement pris en charge par MVC 2.

Si vos classes de modèle sont partagées entre autres projets, vous disposez probablement d'une couche de validation partagée, utilisez donc cette couche de validation. Si vous ne l'avez pas, les donnéesAnnotations vous facilitent votre vie sur les projets MVC.


0 commentaires

2
votes

Je trouve personnellement des données de basenotations très agréables pour la validation des images de vue MVC et de l'entrée affichée. Je ne les aurais jamais jamais mis sur mes modèles commerciaux.

Je suis également devenu assez partiel aux attributs de validation basés sur l'attribut, car il est vraiment facile de passer à la réflexion pour découvrir les attributs où sont les attributs.


0 commentaires

6
votes

Je trouve des annotations de données pratiques pour les modèles où les règles ne changent jamais en fonction du contexte tel qu'une adresse électronique.

Mais pour une validation plus complexe (plusieurs champs, nécessite un accès à dB, etc.) J'utilise le motif de visiteur décrit dans Validation des entités avec les visiteurs et les méthodes d'extension .


2 commentaires

Je prévois d'utiliser la deuxième option que vous avez suggérée - à l'aide du modèle de visiteur. J'ai une question, comment implémentons-nous cela lorsque le modèle est utilisé par un contexte différent. Il faut valider le client de chaîne comme champ requis, mais dans un autre contexte, le client n'est pas requis. Comment faire ce scénario. Apprécier ton aide.


Voir cet article pour un exemple du modèle de visiteur Lostechies.com/jimmybogard/2007/10/24/... puis mélanger quelque chose comme Nuget.org/Packages/fluentValidation



0
votes

Je ne pense pas que vous ayez besoin de vous soucier de partager un domaine décoré dans plusieurs technologies. Les daNaNotations font partie de la BCL et vous pouvez l'utiliser dans WCF, WPF, MVC, Web Formulaires, vous le nommez (peut-être même en Silverlight).

Étant donné que les dataannotations sont désormais une partie centrale de la BCL, nous pouvons nous attendre à ce que d'autres cadres de validation puissent lire ces attributs à l'avenir, car le bloc d'application de validation de la bibliothèque d'entreprise 5.0 fait déjà. Cela permet d'étendre le modèle avec des validations plus complexes plus tard, sans que vous modifiez les règles de validation de base.

Cependant, je peux comprendre que vous souhaitez conserver votre modèle et que les règles de validation sont séparées. Si tel est ce que vous voulez, le bloc d'application de validation (VAB) peut être une bonne alternative (ou même une addition, en raison de son intégration avec des produits de basenotation). VAB prend en charge la validation basée sur la configuration, ce qui vous permet de séparer complètement les règles de validation du modèle.

Lorsque vos règles de validation sont très simples cependant, VAB peut être une overcilleuse. Il est extrêmement puissant et extensible, mais il est également complexe et prend du temps à apprendre.


2 commentaires

Pourriez-vous s'il vous plaît fournir un lien vers une ou plusieurs références de VAB?


Vous pouvez commencer par lire les instructions de validation cs.pdf qui fait partie du téléchargement de laboratoires Hands-on entlib: Bit.ly/gjpvjl (dossier CS \ validation \ instructions). Cela donne un bon aperçu des fonctionnalités de VAB.



0
votes

Un de vos problèmes semble être que vous souhaitez conserver votre code propre. C'est quelque chose ASP.NET MVC qui réalise merveilleusement.

Ce que vous devriez regarder consiste à utiliser View Models Wich vous permet de séparer votre logique commerciale de votre présentation.

Ceci est un ancien article mais il explique les bases: http://geekswithblogs.net /Michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx


0 commentaires