【问题标题】:Single website multiple connection strings using asp mvc 2 and nhibernate使用asp mvc 2和nhibernate的单个网站多个​​连接字符串
【发布时间】:2011-03-01 01:14:50
【问题描述】:

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

有多个数据库具有相同的元数据(因此实体和映射相同)。在登录页面上,用户填写登录名、密码、记住我并从下拉列表中选择他的服务器(实际上他选择了数据库)。

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

我想每个数据库都需要一个会话工厂。

在使用多个数据库之前,我在 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());             
    }

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

对于日志记录,我使用 log4net,即 AdoNetAppender,它包含 connectionString(当然是在 xml 中)。 Q2:我如何管理这个数据库附加程序的多个连接字符串,以便将日志写入当前数据库?除了一直更改 xml 和重置 xml 配置外,我不知道该怎么做,但它确实是一个糟糕的解决方案。

【问题讨论】:

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


    【解决方案1】:

    我想每个数据库都需要一个会话工厂。

    没有;您可以为两个数据库使用一个会话工厂。

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

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

    如果你想要二级缓存,你需要实现你自己的DriverConnectionProvider并通过fluent nh的Provider&lt;TYourDriverConnectionProvider&gt;()方法提供它。

    【讨论】:

    • 您的解决方案听起来很有说服力,过几天试试。二级缓存根本不是必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多