我有一个服务器应用程序,其中我有3种场景,我似乎需要不同类型的非hibernate会话:
- 直接从服务器本身调用存储库(在引导时)
- 来自Ria服务(默认ASP. js)的对存储库的调用。. NET会员服务)
- 来自WCF服务对存储库的调用
目前我已经设置了我的nhibernate配置与sharparch像这样
/// <summary>
/// Due to issues on IIS7, the NHibernate initialization cannot reside in Init() but
/// must only be called once. Consequently, we invoke a thread-safe singleton class to
/// ensure it's only initialized once.
/// </summary>
protected void Application_BeginRequest(object sender, EventArgs e)
{
NHibernateInitializer.Instance().InitializeNHibernateOnce(
() => InitializeNHibernateSession());
BootStrapOnce();
}
private void InitializeNHibernateSession()
{
NHibernateSession.Init(
wcfSessionStorage,
new string[] { Server.MapPath("~/bin/bla.Interfaces.dll") },
Server.MapPath("~/Web.config"));
}
这适用于第三个场景,但不适用于前两个场景。它似乎需要一些特定于wcf会话的上下文。
SharpArch Init方法似乎有防止用另一种类型的sessionstorage重新初始化它的保护;
为三种不同类型的上下文创建不同会话的最佳方法是什么?
对我来说,这篇文章似乎与这篇文章有关,这篇文章帮助我找到了正确的方向,但到目前为止我还没有找到解决方案。
我不确定你能用s#做你想做的事。原因是你真的希望有3个独立的Nhibernate会话,每个会话都有自己的存储机制。当前的实现只允许一种存储机制,而不考虑会话的数量。
我可以很容易地得到# 1和3,但不能得到2,因为我从未使用过RIA服务。在第1和第3种情况下,您需要将WCF服务从站点中取出,并将其放在自己的站点中。没有办法真正解决这个问题,因为它们的会话生命周期是不同的。
你的另一个选择是想出你自己的NHibernate会话管理,而不是使用默认的s#。您可以查看s#版本的代码,并在此基础上创建自己的代码。