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?
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