2010-04-18 7 views
11

En DDD vous ne devriez jamais laisser vos entités entrer dans un état non valide. Cela dit, comment gérez-vous la validation d'une contrainte unique?DDD - Validation de contrainte unique

La création d'une entité n'est pas un vrai problème. Mais disons que vous avez une entité qui doit avoir un nom unique et il y a un millier d'instances de ce type d'entité - elles ne sont pas en mémoire mais stockées dans une base de données. Maintenant, disons que vous voulez renommer une instance.

Vous ne pouvez pas simplement utiliser un setter ... l'objet pourrait entrer dans un état invalide - vous devez valider contre la base de données.

Comment gérez-vous ce scénario dans un environnement web?

Répondre

10

Une contrainte d'unicité peut être réduite à une exception de persistance, plutôt que d'être considéré comme un « état non valide ». Ce n'est pas un état invalide tant que l'objet n'est pas persistant. L'unicité n'a de sens que dans le contexte de la persévérance. De manière réaliste, vous pouvez mettre ce type de règle dans votre mécanisme de validation pour réduire la probabilité de cette erreur, mais dans un vrai système multi-utilisateur, vous ne pouvez pas garantir l'unicité jusqu'à ce qu'une unité de travail réussisse l'action de persistance.

Vous voudrez peut-être dans votre mécanisme de validation, mais vous devez l'appliquer dans votre couche de persistance. Je suis généralement un fan de DDD en tant que méthodologie, mais je pense que le «ne pas autoriser les objets à entrer dans des états invalides» peut nécessiter des abstractions tortueuses. Dans une application Web, avoir un "View Model" séparé est une solution possible, en tant que couche intermédiaire avant la persistance, mais je ne le fais généralement pas jusqu'à ce que je sois convaincu que cela me causera moins de peine que l'alternative plus simple.

+0

Nous vous remercions de votre réponse. Je suis plutôt d'accord avec ce que vous dites mais j'aimerais entendre ce que les puristes pensent d'une «contrainte d'unicité peut être réduite à une exception de persistance» - n'étant pas un état invalide ... Et pour le View Model, j'utilise presque toujours mais il y a un moment où vous devrez mettre à jour votre "vrai" modèle avec les données du Modèle de Vue et vous serez toujours confronté au même problème. – W3Max

+1

DDD n'est pas vraiment une religion; ce n'est pas vraiment de la pureté, c'est de la clarté. Dans la mesure où il s'agit de pureté, vous trouverez que ma pensée a tendance à s'aligner assez proche de DDD canonique la plupart du temps. Cependant, si vous souhaitez résoudre le problème de l'unicité en dehors de la couche de persistance, vous pouvez essayer de modifier le modèle de spécification en fonction de vos besoins. – JasonTrue