使用SharpArch Nhibernate与不同类型的SessionStorage



我有一个服务器应用程序,其中我有3种场景,我似乎需要不同类型的非hibernate会话:

  1. 直接从服务器本身调用存储库(在引导时)
  2. 来自Ria服务(默认ASP. js)的对存储库的调用。. NET会员服务)
  3. 来自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#版本的代码,并在此基础上创建自己的代码。

最新更新