2010-09-15 3 views
1

J'écris une application où les utilisateurs peuvent créer un ou plusieurs "catalogues" qui sont stockés dans une base de données. Cependant, je veux autoriser plusieurs formats de base de données (SQL Server et SQL Lite), et je veux qu'un utilisateur puisse avoir plusieurs catalogues ouverts simultanément dans l'application. L'emplacement des bases de données de catalogue ne sera pas connu avant l'exécution. Je ne veux donc pas de paramètres de base de données spécifiques stockés dans la configuration de l'application.Connexion à plusieurs bases de données de différents types avec NHibernate

Je ne fais que commencer avec NHibernate, mais je prévois de créer des mappages NHibernate pour toutes mes classes liées à un catalogue. J'essaie de trouver le meilleur modèle de conception pour me permettre d'utiliser cet ensemble unique de mappages avec plusieurs bases de données simultanément.

Je pense que je peux omettre le fichier hibernate.cfg.xml dans mon projet qui pointe vers une base de données et un fournisseur spécifique, et qui ne construit qu'à la place les fichiers de mappage (.hbm.xml) dans mon assembly. Est-ce correct?

Ensuite, lorsque mes applications s'exécutent, je crée une configuration NHibernate à partir de l'assembly, qui ne contient que des informations de mappage et pas d'informations spécifiques sur le fournisseur/la base de données. De cette configuration, je vais créer un seul ISessionFactory.

Ensuite, lorsque l'utilisateur veut ouvrir un catalogue, je créer un ADO.NET IDbConnection à la base de données qu'ils spécifient avec le fournisseur correct. Ensuite, pour accéder à la base de données, je transmettrais cette connexion spécifique à la méthode OpenSession() de SessionFactory.

ISession session = sessionfactory.OpenSession(IDbConnection conn); 

Suis-je sur la bonne voie? Ce que je décris fonctionne-t-il ou existe-t-il un meilleur moyen?


Mise à jour

Maintenant que je l'ai fait un peu plus de lecture que je ne pense pas que cela va fonctionner. Une ISessionFactory est configurée pour un dialecte/pilote spécifique, etc. Ainsi, alors qu'une seule ISessionFactory peut basculer entre plusieurs IDBConnections, ces connexions doivent correspondre au même type de base de données. Comme ISessionFactory est immuable, il n'y a aucun moyen de basculer une instance entre la prise en charge d'un type de base de données à l'autre. Est-ce correct? Devrais-je plutôt créer des ISessionFactories induviduales pour chaque type de base de données que je veux supporter?

+0

C'est la bonne approche. Une usine de session par type de base de données. Envisagez également d'étendre NHibernate.Connection.IConnectionProvider pour éviter de transmettre la connexion ado.net.Considérez lien suivant http://knol.google.com/k/fabio-maulo/nhibernate-chapter-2-architecture/1nr4enxv3dpeq/6#2(2E)3(2E)(C2)(A0)Contextual_Sessions pour les sessions contextuelles. – Fahad

Répondre

0

Voici comment je l'ai fait:

Vous avez besoin de deux choses - plusieurs usines de session stockées dans un dictionnaire, puis une autre couche d'abstraction pour accéder à l'usine de session sur la base d'un code.

Chaque fabrique de session sera configurée différemment en fonction de la base de données.

Votre code d'application pourrait ressembler à ceci:

var session = NHibernateSessionManager.OpenSession(factoryCode: "SqlLiteSessionFactory"); 

Je trouve cela est un modèle utile car il y a souvent des raisons pour applications de partage, mais ayant une configuration différente de l'usine de session: par exemple vous pouvez configurer les usines différemment pour la consignation asynchrone ou les opérations par lots; Vous pouvez utiliser différentes connexions de base de données, etc. En utilisant ce modèle, vous pouvez également utiliser différents mappages pour les mêmes entités. Par exemple, des utilisateurs particuliers peuvent avoir besoin d'accéder à une entité via une vue.

+0

Peut ou devrait deux bases de données du même type partagent la même SessionFactory. Dites que j'ai deux bases de données SqlLite et deux bases de données SQL Server. Ai-je besoin de 4 usines de session ou puis-je me débrouiller avec 2? –

+0

J'aimerais voir le code pour cela ... – rebelliard

Questions connexes