11 votes

Doit-on valider soi-même les objets ou entités commerciales ?

La validation des objets métier est un problème courant, mais il existe des solutions pour le résoudre.

Une de ces solutions est d'utiliser le framework NHibernate.Validator autonome, qui est un framework de validation basé sur les attributs.

Cependant, je rencontre une préoccupation conceptuelle. Les validateurs d'attributs comme NH.Validator sont excellents mais la validation n'est effectuée que lors d'une opération de sauvegarde-mise à jour-suppression dans la Session.

Je me demande donc si les objets métier ne devraient pas être auto-validés afin de maintenir leur intégrité et leur cohérence ?

13voto

Sunny Points 3189

À mon avis, il y a 2 étapes de validations nécessaires pour qu'un Objet Métier (BO)/Entité soit valide :

Étape 1 : Auto-validation de l'entité BO - Dans celle-ci, nous vérifions seulement si l'entité est valide en termes de son état. Par exemple : si le code postal est défini, alors est-ce qu'il a des caractères valides et est de longueur valide, etc. Ces validations se font au niveau de l'entité BO. Mais au-delà de ce niveau de validation, nous ne pourrions pas dire que l'entité BO est valide dans votre domaine d'entreprise et/ou dans le référentiel. Typiquement, l'entité BO serait capable d'appliquer ce niveau de validation.

Étape 2 : Validation du contexte - Dans celle-ci, nous devons valider si l'entité BO est valide dans le contexte du référentiel où elle est enregistrée. Par exemple : le code postal est-il valide pour le pays dans lequel la commande est passée/envoyée, etc. Pour cette validation, certaines ou toutes les entités dans le contexte actuel pourraient être impliquées pour s'assurer que l'entité BO est valide.

Donc, pour maintenir les entités pures, vous devrez diviser la validation en ces 2 étapes - l'une effectuée par l'entité elle-même et l'autre par le référentiel qui persiste/travaille avec l'entité.

HTH.

6voto

Michael Stum Points 72046

Il n'est pas toujours possible pour eux de s'auto-valider cependant. Et si vous entrez un code postal "invalide"? Vous pourriez valider que le code postal doit être dans un format spécifique, mais que faire s'ils doivent être "valides", c'est-à-dire "existant et correspondant à la ville"? Ou si vous n'acceptez que des numéros de téléphone provenant de certains indicatifs régionaux, et que la liste des codes valides est dans une base de données gérée par le service juridique?

Si vous pouvez effectuer une validation sémantique, c'est génial et pourrait aller dans la Classe Business. Mais souvent, vous pourriez avoir besoin d'une validation supplémentaire qui n'est tout simplement pas gérable par la classe business elle-même mais doit être gérée par la classe qui communique avec la base de données et d'autres services externes.

2voto

Javier Points 1728

Je ne sais pas si nous parlons de la même idée, mais si c'est le cas, j'aime ce que vous expliquez. Très rapidement, je vais expliquer ce que je fais pour résoudre cela. Dans mon cas, tous les objets métier de ma couche de domaine doivent remplacer deux méthodes :

Évidemment, pour maintenir cela, j'ai plus de classes impliquées, mais je ne vais pas toutes les écrire ici, car je vais simplement essayer d'expliquer le concept.

List notPassedValidationRules = new List();

//...

public override void ValidateErrorsWhenSaving(Validator validator)
{
    //...
}

public override void ValidateErrorsWhenDelete(Validator validator)
{
   //...
}        

Dans ces méthodes, je vérifie certaines conditions booléennes, en maintenant une collection de règles non validées. Dans mon cas, ces méthodes sont invoquées avant que mon Unité de Travail valide les changements (insertion de nouvelles entités, mise à jour, suppression), et affiche les erreurs possibles à l'utilisateur, avant la validation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X