3

asp.net mvc アプリに NHibernate を接続しました。

ISession を破棄しなければ、すべて正常に動作します。ただし、破棄する必要があることを読みましたが、破棄すると、「セッションが閉じられました」というランダムな例外が発生します。

Windsor を使用して、ISession を他のオブジェクトに注入しています。

これが私の現在のNHModuleです:

public class NHibernateHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += context_BeginRequest;
        context.EndRequest += context_EndRequest;
    }

    static void context_EndRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Unbind(MvcApplication.SessionFactory);
    }

    static void context_BeginRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Bind(MvcApplication.SessionFactory.OpenSession());
    }

    public void Dispose()
    {
        // do nothing
    }
}

ISession の登録:

container
  .Register(Component.For<ISession>()
     .UsingFactoryMethod(() =>  MvcApplication.SessionFactory.GetCurrentSession()).LifeStyle.Transient);

モジュールのアンバインドで Dispose を追加すると、エラーが発生します。セッションが閉じられているというエラーが発生し続けるので、これは正しい方法ではないと思いますが、正しい方法は何ですか?

ありがとう、ジョー

4

3 に答える 3

1

ロバートの言うとおりです。Windsor は、セッションに依存するコンポーネントを解放するときにセッションを破棄しています。独自の HttpModule を用意するよりも、Windsor の PerWebRequest ライフスタイルを ISession に使用することをお勧めします。

于 2010-07-28T10:55:46.360 に答える
0

ウィンザーがセッションを破棄しようとする前に、セッションを保持しているオブジェクトが破棄されたようです。簡単な修正は、NHiberanteSessionFactory Disposeメソッドを確認し、セッションがすでに閉じられているかどうかを確認することです。

于 2010-01-25T13:08:01.930 に答える
0

この記事が役立つと思います: NHibernate を使用したデスクトップ To-Do アプリケーションの構築

これがデスクトップ アプリケーションであることはわかりましたが、この MSDN の記事からヒントを得られるかもしれません。

于 2010-01-29T14:34:19.237 に答える