我目前正在使用 StructureMap 将一个 NHibernateRegistry
实例注入(inject)到我的 DAL 中,它为单个连接字符串配置 NHibernate 并为我的单用户引导一个 Singleton FluentConfiguration
应用程序。
我应该如何根据路由 URL 中的 {tenant}
路由参数修改我的 Fluent NHibernate 配置以使用不同的数据库?
路由示例:
{tenant}/{controller}/{action}/{id}
...其中对 branch1/Home/Index
和 branch2/Home/Index
的请求使用相同的应用程序代码,但使用不同的数据库来检索显示的数据。
我过去通过注入(inject)每个请求 TenantContext
对象解决了 StructureMap 和 LINQ 的这个问题,该对象从它作为构造函数接受的 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>();
}
}
结构图配置:
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 的新手,所以我不确定我的 session 和配置的范围。 NHibernate 有内置的方法来处理这个问题吗?
最佳答案
这在一个模块中对我有用
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(x => x.FromConnectionStringWithKey("IMB"))
.Cache(c => c.UseQueryCache().QueryCacheFactory<StandardQueryCacheFactory>()
.RegionPrefix("IMB")
.ProviderClass<HashtableCacheProvider>()
.UseMinimalPuts()).UseReflectionOptimizer())
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.Load("IMB.Data")))
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.Load("IMB.Security")))
.ExposeConfiguration(
c => c.SetProperty("current_session_context_class", "web"))
.ExposeConfiguration(cfg => _configuration = cfg)
.BuildSessionFactory();
关于使用 Fluent NHibernate 和 StructureMap 的每个租户的数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5718564/