2010-08-23 3 views
1

Je suis confronté à un problème de conception qui, j'en suis sûr, a une réponse simple et/ou a été résolu auparavant. J'ai lu, réfléchi et cherché des solutions pendant un bon moment, mais rien ne semble vraiment logique. L'essentiel du problème est que j'ai affaire à une série d'anciens systèmes et bases de données et j'essaie d'adopter une approche DDD pour créer de nouvelles applications et remplacer les plus anciennes. Le problème principal est que, bien que mes entités de domaine, objets de valeur et agrégats aient un sens commercial, lorsque je considère la persistance, j'ai un gros problème ... les entités d'un agrégat sont actuellement conservées dans plusieurs bases de données. Par exemple, disons que j'ai des entités A, B et C où A est la racine agrégée. Par exemple, disons que j'ai des entités A, B et C. J'ai un référentiel pour A et j'utilise l'unité de travail autour d'une session NHibernate pour la persistance. Tout va bien et bien tant que A, B et C sont tous persistés sur un seul serveur/base de données. Dans mon cas, cependant, A et B peuvent être sur un serveur/base de données et C peut être conservé sur un serveur/base de données complètement différent. Je me rends compte que la sagesse conventionnelle pourrait suggérer que l'on ne devrait jamais faire cela, mais j'ai affaire à un héritage. Bien sûr, avec le temps je vais probablement refactoriser le niveau de données à quelque chose de plus logique, mais pour l'instant je suis bloqué. Je soupçonne que je vais toujours avoir ce problème dans une certaine mesure et je ne peux pas m'empêcher de penser que d'autres ont traversé ce pont. En bref, j'ai un framework développé en C# composé de Fluent/NHibernate pour la persistance, Unity for IoC et employant des modèles de Référentiel standard et (ou au moins reconnaissable). En ce qui concerne les bases de données, j'ai affaire à MS SQL Server et Oracle.Quel est un bon moyen de gérer les entités dans un agrégat qui persistent dans plusieurs bases de données?

Des pensées?

+0

Pourriez-vous être plus précis? Peut-être élaborer sur A, B et C? –

+0

Supposons donc que j'ai une racine agrégée qui est Car avec une entité Engine et une entité Wheel. J'ai un CarRepository et ma voiture et ma roue sont persistées dans la base de données ABC et mon moteur est conservé dans la base de données XYZ. Existe-t-il un moyen d'utiliser NHibernate (ou similaire) pour tout persister (sachant qu'il y aurait plus d'une ISession)? Est-ce que je compromets mon domaine métier et crée EngineRepository sans exposer le moteur via CarRepository? Je n'arrive pas à trouver quelque chose qui ne crée pas d'odeurs de design. Peut-être essayer de construire mon propre UoW qui permet cela? – Greg

Répondre

0

La racine agrégée ne doit pas être présente sur plusieurs bases de données. Greg Young parle de ce même problème here


Quelque chose like this est ce que vous devriez faire.

+0

D'accord. Je ne dessinerais jamais de la base comme ça, mais c'est hérité. Pour l'instant, la seule vraie solution que je puisse proposer est de compromettre mon modèle de domaine et de créer des référentiels centrés sur une seule base de données (ou au moins sur un serveur). – Greg

+0

@Greg vérifier ce lien fourni. Cela pourrait vous aider. –

+0

ce lien vers le post de Ayende a été très utile. Je devais vraiment m'asseoir et reconsidérer mon approche, mais à la fin est sorti avec une bien meilleure approche. Merci! – Greg

Questions connexes