使用asp mvc 2和nhibernate的单个网站多个​​连接字符串

时间:2010-06-08 08:03:16

标签: nhibernate asp.net-mvc-2 log4net structuremap multiple-databases

在我的网站中,我使用ASP MVC 2 + Fluent NHibernate作为orm,StructureMap用于IoC容器。

有几个数据库具有相同的元数据(因此实体和映射是相同的)。在LogOn页面上,用户在登录,密码,记忆中输入并从下拉列表中选择他的服务器(实际上他选择了数据库)。

Web.config包含所有connstrings,我们可以假设它们不会在运行时更改。

我认为每个数据库需要一个会话工厂。

在使用多个数据库之前,我将类加载到Application_Start

中的StructureMap ObjectFactory
ObjectFactory.Initialize(init => init.AddRegistry<ObjectRegistry>());
ObjectFactory.Configure(conf => conf.AddRegistry<NhibernateRegistry>());

NhibernateRegistry类:

public class NhibernateRegistry : Registry
{
    public NhibernateRegistry()
    {
        var sessionFactory = NhibernateConfiguration.Configuration.BuildSessionFactory();

        For<Configuration>().Singleton().Use(
            NhibernateConfiguration.Configuration);
        For<ISessionFactory>().Singleton().Use(sessionFactory);
        For<ISession>().HybridHttpOrThreadLocalScoped().Use(
            ctx => ctx.GetInstance<ISessionFactory>().GetCurrentSession());
    }

}

在Application_BeginRequest中,我将打开的nhibernate会话绑定到asp会话(每个请求的nhibernate会话),并在EndRequest中取消绑定它们:

 protected void Application_BeginRequest(
        object sender, EventArgs e)
    {            
            CurrentSessionContext.Bind(ObjectFactory.GetInstance<ISessionFactory>().OpenSession());             
    }

问题1:如何根据经过身份验证的用户了解我应该使用的SessionFactory? 是像UserData填充数据库名称(我使用简单的FormsAuthentication)

对于日志记录我使用log4net,即包含connectionString的AdoNetAppender(当然是xml)。 Q2:如何管理此数据库appender的多个连接字符串,以便将日志写入当前数据库?我不知道如何做到这一点,除了一直改变xml和重置xml配置,但它真的很糟糕的解决方案。

1 个答案:

答案 0 :(得分:1)

  

我认为每个数据库需要一个会话工厂。

没有;你可以为两个数据库的一个会话工厂做好。

您只需提供已打开的IDbConnection作为OpenSession() ISessionFactory方法的参数。

通过这样做,您将失去二级缓存的可能性,但这可能不是问题。

如果您需要二级缓存,则需要实现自己的DriverConnectionProvider并通过流畅的nh Provider<TYourDriverConnectionProvider>()方法提供。