如何在同一个HttpRequest中将NHibernate连接到多个数据库服务器?

时间:2012-07-15 18:24:21

标签: asp.net nhibernate fluent-nhibernate

我有一个ASP.NET 4 Web应用程序(MVC 4候选版本,NHibernate 3,Fluent-NHibernate),它需要在同一个HttpRequest期间从两个不同的数据库(每个在不同的服务器上)读取数据。我有两个存储库:IndividualRepository和ProductRepository。 Individual存储库是只读的,并连接到数据库A;产品存储库是可读/写的,并连接到数据库B.两个数据库在web.config中都有一个连接字符串。

我强加于此“多数据库服务器”要求之前的策略是将HttpModule与静态SessionFactoryProvider<WebSessionContext>连接起来。它有一个静态方法“GetCurrentSession”,它通过sessionFactoryProvider.GetCurrentSession()返回ISession。然后在BeginRequest上调用sessionFactoryProvider.Bind(),在EndRequest上调用sessionFactoryProvider.Unbind()

通过添加第二个数据库服务器,我的计划是创建第二个静态SessionFactoryProvider<WebSessionContext>和相应的GetCurrentSession方法。

为了测试puropses,我有2个NUnit测试(每个存储库1个),我与会话工厂提供程序有类似的设置,这次使用SessionFactoryProvider<ThreadStaticSessionContext>。我怀疑使用ThreadStatic作为会话上下文是问题的一部分,但我无法测试这两个存储库。我无法让我的测试工作,所以我没有尝试过实际的Web应用程序。

我只是把我的测试写错了吗?我是否应该使用ThreadStaticSessionContext之外的其他内容进行集成测试?我已经能够让我的每个测试方法都在issolation中工作,但是当包含两个会话工厂提供者时,只有1个工作。一旦我的测试工作,我的网络应用程序中使用WebSessionContext的两个工厂提供商会遇到类似的问题吗?

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

回答您的问题 - 是的,可以在单个HTTP请求中使用NHibernate连接到多个数据库服务器。

我自己使用它,但是我显然与你使用的会话管理有不同的会话管理。我没有绑定BeginRequest()中的会话,而是使用IoC容器并通过控制器的构造函数检索ISessionBuilder,然后通过sessionBuilder.GetSession()请求会话。

那就是说,我怀疑你问题的解决方案与我所连接的解决方案类似。基本上,我没有单ISessionFactory,而是保留它们的字典(由数据库服务器标识符键入)。

如果这不能引导您找到可行的解决方案,则可能需要提供SessionFactoryProvider的代码。