使用 Fluent NHibernate 和 StructureMap 的每个租户的数据库

标签 database asp.net-mvc-3 fluent-nhibernate structuremap multi-tenant

我目前正在使用 StructureMap 将一个 NHibernateRegistry 实例注入(inject)到我的 DAL 中,它为单个连接字符串配置 NHibernate 并为我的单用户引导一个 Singleton FluentConfiguration应用程序。

我应该如何根据路由 URL 中的 {tenant} 路由参数修改我的 Fluent NHibernate 配置以使用不同的数据库?

路由示例:

{tenant}/{controller}/{action}/{id}

...其中对 branch1/Home/Indexbranch2/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/

相关文章:

java - JDBC - 创建/准备好的语句 : What happens and are they concurrent?

jQuery 不显眼的验证忽略 MVC3 中的 data-val-required 消息

asp.net - 如何在 Orchard 中找到资源

c# - Fluent NHibernate 加入不使用主键

mysql - SQL 间歇性地不返回任何数据来响应 LEFT JOIN

android - 无法从 Android 直接连接到 SQL Server

php - 从在线数据库检索数据

c# - 您可以 [过时] Razor 中的 DisplayTemplate 吗?

mysql - 插入多行时出现 NonUniqueObjectException 错误,LAST_INSERT_ID() 返回 0

c# - 如何在流利的 nhibernate 中为引用添加条件?