В настоящее время я использую StructureMap для внедрения экземпляра NHibernateRegistry
в мой DAL, который настраивает NHibernate для одной строки подключения и загружает Singleton FluentConfiguration
для моего однопользовательского приложения.
Как мне изменить конфигурацию Fluent NHibernate для использования другой базы данных на основе параметра маршрутизации {tenant}
в URL-адресе маршрутизации?
Пример маршрутизации:
{tenant}/{controller}/{action}/{id}
... где запросы для branch1/Home/Index
и branch2/Home/Index
используют один и тот же код приложения, но разные базы данных для извлечения отображаемых данных.
Я решил эту проблему в прошлом для StructureMap и LINQ, внедрив объект TenantContext
для каждого запроса, который извлек параметр маршрутизации из HttpContext
, который он принял как параметр конструктора, и указал другой контекст данных LINQ.
Однако я подозреваю, что NHibernate лучше справляется с этим, чем я мог приготовить.
Частично NHibernateRegistry
Класс
public class NHibernateRegistry : Registry
{
// ... private vars here
public NHibernateRegistry()
{
var cfg = Fluently.Configure()
.Database(MsSqlConfiguration
.MsSql2008.ConnectionString(c =>
c.FromConnectionStringWithKey("TenantConnectionStringKey")))
// where to inject this key?
.ExposeConfiguration(BuildSchema)
.Mappings(x =>
x.FluentMappings.AddFromAssembly(typeof(UserMap).Assembly)
For<FluentConfiguration>().Singleton().Use(cfg);
var sessionFactory = cfg.BuildSessionFactory();
For<ISessionFactory>().Singleton()
.Use(sessionFactory);
For<ISession>().HybridHttpOrThreadLocalScoped()
.Use(x => x.GetInstance<ISessionFactory>().OpenSession());
For<IUnitOfWork>().HybridHttpOrThreadLocalScoped()
.Use<UnitOfWork>();
For<IDatabaseBuilder>().Use<DatabaseBuilder>();
}
}
Конфигурация StructureMap:
public static class Bootstrapper
{
public static void ConfigureStructureMap()
{
ObjectFactory.Initialize(Init);
}
private static void Init(IInitializationExpression x)
{
x.AddRegistry(new NHibernateRegistry()); // from Data project
}
}
Я новичок в NHibernate, поэтому я не уверен, что смогу определить объемы своих сессий и конфигурации. Есть ли в NHibernate встроенный способ справиться с этим?