2008-10-07 14 views
3

Lorsque vous définissez la valeur d'une propriété, vous pouvez la valider avant ou après la mise à jour de la valeur interne. En cas de validation antérieure, vous pouvez lever une exception si la nouvelle valeur n'est pas valide. L'objet est alors toujours dans un état valide.Comment valider une propriété d'un objet personnalisé dans un scénario de liaison de données (c'est-à-dire BindingList)?

Si la validation après annulation est souhaitée (par exemple par l'intermédiaire d'IEditableObject), de sorte que l'utilisateur peut annuler la modification à tout moment. Nous avons également la possibilité de lancer une exception ici ou d'exposer les erreurs via IDataErrorInfo.

Je ne pense pas IDataErrorInfo est logique si la validation avant l'ensemble. Certains peuvent également prétendre que lancer une exception n'est pas justifié dans les scénarios de validation.

La validation après les travaux est excellente dans les scénarios où l'objet personnalisé est contenu dans BindingList et défini comme source de données dans une grille.

Validation fonctionne avant ok avec des grilles aussi, mais vous avez sorte de jeter une exception pour signaler le réglage de la valeur de la propriété a échoué à la grille de données (sans beaucoup de code supplémentaire)

Je suis aussi pas à l'aise avec mes objets de domaine mise en œuvre IEditableObject et IDataErrorInfo, INotifyPropertyChanged, etc. Il laisse l'objet de domaine encombré avec des préoccupations supplémentaires. Mais cela semble inévitable si vous voulez vous positionner avec la liaison de données. Je pourrais peut-être créer un wrapper, DTO peut-être, mais je ne suis pas trop fou d'avoir à écrire du code supplémentaire pour la plupart du temps juste pour supporter ces bits de liaison de données.

Comment validez-vous les objets (de préférence dans le contexte de la liaison de données et de l'interface utilisateur)?

Répondre

1

Voir my answer à Business Objects, Validation And Exceptions: Je pense que les idées de Paul Stovell sur la validation (résumé in this article) sont incroyablement puissant.

En mettant en œuvre IDataErrorInfo dans vos entités de domaine (et peut-être IEditableObject et INotifyPropertyChanged), vous leur donnez la possibilité d'obtenir databound sur de nombreuses technologies de présentation .NET (Windows Forms, WPF, ASP .NET ...) sans beaucoup de code. Ou vous pouvez les utiliser dans des scripts ou des lots (ie processus non UI) et avoir toujours la possibilité de les valider par rapport aux règles métier: soit en douceur (interroger l'état actuel de l'entité) soit en hard (lancer une exception si non valide). La principale chose est que, avec ce modèle, vos entités de domaine sont responsables de leur propre validation (ce qui est bon, et ne me semble certainement pas préoccupations supplémentaires). Ils l'appliquent en émettant des exceptions significatives sur l'enregistrement s'ils sont dans un état invalide. Et ils peuvent jouer bien avec votre code (UI ou non), en vous permettant de savoir si elles sont valides ou non si vous souhaitez demander d'abord.

J'applique même ces principes au-delà du modèle de domaine dans mon projet d'usine de logiciel (encore dans les premiers stades): Salamanca.

+0

J'avais trouvé le blog de Paul Stovell avant d'écrire ce q et c'est là que je me suis retrouvé dans un dilemme, que ce soit pour suivre son approche ou non. En effet, j'ai fini par utiliser son approche. Ma mise en œuvre est un peu plus complexe que je n'aime pas, mais inévitable. Je ne suis toujours pas totalement convaincu que c'est la voie à suivre mais je n'ai pas trouvé d'alternative qui soit meilleure. –