10
votes

Les objets d'affaires ou les entités devraient-ils être auto-validés?

La validation des objets commerciaux est un problème courant, mais il existe certaines solutions pour résoudre ce problème.

Une de ces solutions consiste à utiliser le cadre autonome Nhibernate.Validator, qui est un cadre de validation basé sur l'attribut.

Mais je suis confronté à une préoccupation conceptuelle. Les validateurs d'attribut tels que NH.Validator sont excellents, mais la validation n'est effectuée que lorsque Save-Update-Supprez dans la session.

Je me demande si des objets métier ne devraient pas être auto-validés afin de maintenir leur propre intégrité et sa propre consistance?


0 commentaires

3 Réponses :


6
votes

Ce n'est pas toujours possible pour eux de s'auto-valider cependant. Et si vous entrez un code postal "invalide"? Vous pouvez valider que le code postal doit être dans un format spécifique, mais si vous voulez qu'ils soient «valides», c'est «existant et correspondant à la ville»? Ou si vous n'acceptez que si vous acceptez des numéros de téléphone à partir de certains codes de zone 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 d'entreprise. Mais souvent, vous aurez peut-être besoin de validation supplémentaire qui n'est tout simplement pas possible à gérer par la classe d'entreprise elle-même mais doit être gérée par la classe qui parle à la base de données et à d'autres services externes.


2 commentaires

+1 Vous avez raison. Dans mon explication, je parle de validations pouvant être auto-contrôlées par les entités.


Je suis d'accord. Je préfère garder ma logique de validation distincte de par des entités commerciales.



2
votes

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

Évidemment, pour le maintenir, j'ai plus de classes impliquées, mais je n'écriras pas tout ici, car je suis seulement essayé d'expliquer le Concept P>

List<ValidationRule> notPassedValidationRules = new List<ValidationRule>();

//...

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

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


0 commentaires

11
votes

IMHO - Il y a 2 étapes de validations nécessaires à un objet métier (BO) / entité à être valide:

Step1: auto-validation de l'entité - Dans ce cas, nous ne vérifions que si l'entité est valide en termes de son état F.Ex.: Si le code postal est défini, il dispose-t-il de caractères valides et d'une longueur valide, etc. Formulaire les validations de niveau BO / entité. Mais au-delà de ce niveau de validation, nous ne pourrions pas dire que la BO / entité est valide dans votre domaine d'entreprise et / ou votre référentiel. Typiquement, la BO / entité serait en mesure d'appliquer ce niveau de validation.

Step2: Validation contextuelle - Dans ce cas, nous devons valider si la BO / entité est valide dans le contexte du référentiel où il est persisté. F.ex.: Le code postal est valable pour le pays dans lequel la commande est placée / envoyée à etc. Pour cette validation, certaines ou toutes les entités du contexte actuel devraient être impliquées pour s'assurer que la BO / entité est valide.

Donc, pour garder les entités pure, vous devrez diviser la validation en 2 étapes - une fois par l'entité elle-même et la seconde par le référentiel qui persiste / travaillant avec l'entité.

hth.


1 commentaires

Cette séparation des deux étapes est intéressante. Bien que je n'en ai jamais vraiment pensé de cette façon, j'utilise partiellement cette approche sans savoir. Pourtant, j'essaie de séparer également la validation de soi des entités. J'ai expliqué comment je l'ai fait avec le bloc d'application de validation ici: Stackoverflow.com/Questtions/2258513/... .