Я пишу приложение, в котором пользователи могут создавать один или несколько «каталогов», которые хранятся в базе данных.Однако я хочу разрешить использование нескольких форматов баз данных (SQL Server и SQL Lite) и хочу, чтобы пользователь мог одновременно открывать в приложении несколько каталогов.Расположение баз данных каталога не будет известно до времени выполнения.Поэтому я не хочу, чтобы какие-либо конкретные параметры базы данных хранились в конфигурации приложения.
Я только начинаю работу с NHibernate, но я планирую создать отображения NHibernate для всех моих классов, связанных с каталогом.Я пытаюсь найти лучший шаблон проектирования, позволяющий мне использовать этот единственный набор сопоставлений с несколькими базами данных одновременно.
Я думаю, что могу опустить файл hibernate.cfg.xml
в моем проекте, который указывает на конкретныйбазы данных и провайдера, и вместо этого только встроить файлы сопоставления (.hbm.xml) в мою сборку.Правильно ли это?
Затем, когда мои приложения запускаются, я создаю конфигурацию NHibernate из сборки, которая содержит только информацию сопоставления, а не какую-либо конкретную информацию о поставщике / базе данных.Из этой конфигурации я создам один ISessionFactory
.
Затем, когда пользователь захочет открыть каталог, я бы создал ADO.NET IDbConnection
для базы данных, которую он указал с правильным провайдером.Затем, чтобы получить доступ к базе данных, я передам это конкретное соединение методу OpenSession () единственного SessionFactory.
ISession session = sessionfactory.OpenSession(IDbConnection conn);
Я на правильном пути?Будет ли то, что я описываю, работать, или есть лучший способ?
Обновление
Теперь, когда я прочитал больше, я не думаю, что этобуду работать.ISessionFactory настроен для определенного диалекта / драйвера и т. Д. Таким образом, хотя один ISessionFactory может переключаться между несколькими IDBConnections, эти соединения должны быть к одному и тому же типу базы данных.Поскольку ISessionFactory является неизменным, нет способа переключить экземпляр между поддержкой одного типа базы данных другим.Это правильно?Стоит ли вместо этого создавать отдельные ISessionFactories для каждого типа базы данных, которую я хочу поддерживать?