Wcf 将SharpArch Nhibernate与不同类型的会话存储一起使用

Wcf 将SharpArch Nhibernate与不同类型的会话存储一起使用,wcf,nhibernate,session,ria,s#arp-architecture,Wcf,Nhibernate,Session,Ria,S#arp Architecture,我有一个服务器应用程序,其中我有3个场景,其中我似乎需要不同类型的nhibernate会话: 直接从服务器本身调用存储库(引导时) 从Ria服务(默认ASP.NET Memberschip服务)调用存储库 来自WCF服务的对存储库的调用 目前我已经用sharparch设置了我的nhibernate配置,如下所示 /// <summary> /// Due to issues on IIS7, the NHibernate initialization cannot reside in

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

  • 直接从服务器本身调用存储库(引导时)
  • 从Ria服务(默认ASP.NET Memberschip服务)调用存储库
  • 来自WCF服务的对存储库的调用
  • 目前我已经用sharparch设置了我的nhibernate配置,如下所示

    /// <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"));
    }
    
    //
    ///由于IIS7上的问题,NHibernate初始化无法驻留在Init()中,但
    ///只能调用一次。因此,我们调用一个线程安全的单例类来
    ///确保它只初始化一次。
    /// 
    受保护的无效应用程序\u BeginRequest(对象发送方,事件参数e)
    {
    NHibernateInitializer.Instance().InitializeNHibernateOnce(
    ()=>InitializeNHibernateSession());
    BootStrapOnce();
    }       
    private void InitializeNHibernateSession()的初始值
    {
    NHibernateSession.Init(
    WCF会话存储,
    新字符串[]{Server.MapPath(“~/bin/bla.Interfaces.dll”)},
    Server.MapPath(“~/Web.config”);
    }
    
    这适用于第三种场景,但不适用于前两种场景。 它似乎需要一些特定于wcf会话的上下文

    SharpArch Init方法似乎具有保护功能,不会使用另一种类型的会话存储重新初始化它

    为三种不同的上下文创建不同会话的最佳方法是什么


    在我看来,这篇文章似乎与帮助我找到正确方向的相关,但到目前为止,我还没有找到解决方案。

    我不确定你是否能够用S#做你想做的事。原因是您确实希望有3个单独的Nhibernate会话,每个会话都有自己的存储机制。当前的实现只允许一种存储机制,而不考虑会话的数量

    我可以很容易地得到你的1和3,但不是2,因为我从未使用过RIA服务。在1和3的情况下,您需要将WCF服务从站点中取出并放在它自己的站点中。由于他们的会话生命周期不同,因此无法真正绕过这一点


    您的另一个选择是为NHibernate提供自己的会话管理,而不是使用默认的S#one。您可以查看S#版本的代码,并在此基础上创建自己的代码。

    我们还得出结论“使用sharparch时,我们不能有多个会话管理系统”。正因为如此,我们不再使用它了。很抱歉听到这个消息,但它并不适合所有人。我确实认为您可以使用它,但您需要修改您的体系结构才能使用它。google组上的此线程可能对您有所帮助:。不管怎样,感谢您查看框架,祝您的项目好运。