我有一个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
的两个工厂提供商会遇到类似的问题吗?
非常感谢任何帮助!
答案 0 :(得分:0)
回答您的问题 - 是的,可以在单个HTTP请求中使用NHibernate连接到多个数据库服务器。
我自己使用它,但是我显然与你使用的会话管理有不同的会话管理。我没有绑定BeginRequest()
中的会话,而是使用IoC容器并通过控制器的构造函数检索ISessionBuilder
,然后通过sessionBuilder.GetSession()
请求会话。
那就是说,我怀疑你问题的解决方案与我所连接的解决方案类似。基本上,我没有单ISessionFactory
,而是保留它们的字典(由数据库服务器标识符键入)。
如果这不能引导您找到可行的解决方案,则可能需要提供SessionFactoryProvider
的代码。