2009-05-27 8 views
2

J'essaie de conserver la couche de mon domaine aussi "pure" que possible sans se soucier de la persistance ou d'autres problèmes d'infrastructure. Cependant, il y a des moments où ma couche de domaine a besoin d'utiliser les services d'un RDBMS ou d'une autre dépendance externe et je ne suis pas sûr de la façon de gérer cela. Par exemple, chaque objet de domaine dans mon application implémente une interface IValidatable qui est invoquée par les clients pour obtenir une liste de règles brisées qui empêchent l'objet d'être persisté. Dans quelques cas, la routine de validation mentionnée ci-dessus implique de faire un appel à une classe DAO pour vérifier l'existence d'un enregistrement spécifique. Nous n'utilisons pas d'ORM; à la place, nous utilisons une couche de persistance construite à l'aide du modèle d'objet d'accès aux données. Dois-je simplement créer une classe service/wrapper autour de cet accès à la base de données et faire en sorte que mon objet domaine collabore avec? L'ajout de ce niveau d'indirection est-il acceptable ou suis-je encore en train de polluer mon objet domaine?Accès au calque de domaine pour les éléments de persistance

+0

Comment l'enregistrement spécifique est-il lié à l'objet de domaine? –

Répondre

2

La réponse habituelle serait d'utiliser une interface objet-relationnelle quelconque. Votre couche Domaine présente l'interface de votre modèle de domaine. Vous avez une base de données relationnelle sous les couvertures, et vous avez besoin d'une couche entre eux pour effectuer object-relational mapping. Vous dites "nous n'utilisons pas un ORM" mais en fait vous l'êtes: vous effectuez ce mappage directement dans la couche domaine.

Le problème de la réalisation de cette correspondance est connu sous le nom de problème object-relational impedance mismatch. Si vous insistez pour ne pas identifier une couche ORM explicite, alors oui, vous devez écrire des classes pour encapsuler les détails de l'utilisation du SGBD (bien sûr, vous y aurez introduit des classes ORM).

Vraiment, il est très difficile d'éviter d'avoir une couche ORM.

1

J'ai longtemps été d'avis que vous ne pouvez pas cacher la connaissance de la persistance dans un objet de domaine persistant. Essayer de le faire devient de plus en plus artificiel et introduit des effets secondaires bizarres. En d'autres termes, je pense qu'il est bon d'intégrer la connaissance de la persistance dans la couche domaine, mais pas nécessairement le moyen exact de persistance; une interface DAO doit être utilisée.

Je devrais ajouter que, selon votre vérification de validation, vous êtes soumis à une condition de concurrence. Vous devriez être prêt à gérer toutes les exceptions de contraintes qui pourraient survenir à cause de cela.

Questions connexes