2

本当に、私の質問はタイトルにあります...セッションごとのリクエストのためにナンシーでNHibernateセッションをどのように処理する必要がありますか? それ自体に良い答えがある場合は、それを選択してください...さらに背景が必要な場合は、次のとおりです。


ASP.NET MVC で actionFilter を使用して、Web 要求の開始時と終了時に NHibernate コンテキストでセッションを開いたり閉じたりすることに慣れています。こうすることで、リクエストのコンテキスト内の各データベース操作で同じセッションが使用されます。

Nancy を使用する新しいプロジェクトで同じ種類のものをセットアップしたと思っていましたが、セッションが必要になるたびに新しいセッションが生成されます。ブートストラッパーでセッションの開始と終了を処理する方法は次のとおりです (StructureMapBootstrapper から継承):

protected override void RequestStartup(IContainer container, IPipelines pipelines, NancyContext context)
{
    var sessionContainer = container.GetInstance<ISessionContainer>();
    pipelines.BeforeRequest.AddItemToStartOfPipeline(x =>
    {
        sessionContainer.OpenSession();
        return x.Response;
    });
    pipelines.AfterRequest.AddItemToEndOfPipeline(x => sessionContainer.CloseSession());
}

私のは、このサイトISessionContainerに似たものに基づいています。私の実装では、NHibernate のセッション コンテキストを使用して「現在のセッション」を取得します。ISessionContainer

現在、Nancy プロジェクトでこれを試すと、ISessionContainer.Sessionプロパティが要求されるたびに新しいセッションが返されます。Nancy では Cookie ベースのセッションがデフォルトで有効になっていないためだと考えたので、これをブートストラップに追加しました。

protected override void ApplicationStartup(IContainer container, IPipelines pipelines)
{
    CookieBasedSessions.Enable(pipelines);
}

サイコロはありません。新しいセッションを依頼するたびに、今でも新しいセッションが与えられています。

しかし、本当に、私は自分の問題を診断したくありません。Nancy で NHibernate セッション管理を処理する標準的な方法を知りたいです。

4

2 に答える 2

4

RestBucks サンプルの私の Nancy ポートでは、 NHibernate をリクエストごとのシーション方式で使用しています。

そのサンプルのブートストラップでは、次の NHibernate のセットアップがあります。

protected override void ApplicationStartup(IWindsorContainer container, 
                                           Nancy.Bootstrapper.IPipelines pipelines)
{
  base.ApplicationStartup(container, pipelines);
  pipelines.BeforeRequest += ctx => CreateSession(container);
  pipelines.AfterRequest += ctx => CommitSession(container);
  pipelines.OnError += (ctx, ex) => RollbackSession(container);
  // Other startup stuff 
}

private Response CreateSession(IWindsorContainer container)
{
  var sessionFactory = container.Resolve<ISessionFactory>();
  var requestSession = sessionFactory.OpenSession();
  CurrentSessionContext.Bind(requestSession);
  requestSession.BeginTransaction();

  return null;
}

private AfterPipeline CommitSession(IWindsorContainer container)
{
  var sessionFactory = container.Resolve<ISessionFactory>();
  if (CurrentSessionContext.HasBind(sessionFactory))
  {
    var requestSession = sessionFactory.GetCurrentSession();
    requestSession.Transaction.Commit();
    CurrentSessionContext.Unbind(sessionFactory);
    requestSession.Dispose();
  }
  return null;
 }    

private Response RollbackSession(IWindsorContainer container)
{
  var sessionFactory = container.Resolve<ISessionFactory>();
  if (CurrentSessionContext.HasBind(sessionFactory))
  {
    var requestSession = sessionFactory.GetCurrentSession();
    requestSession.Transaction.Rollback();
    CurrentSessionContext.Unbind(sessionFactory);
    requestSession.Dispose();
  }
  return null;
}

NHibernate セッションをどのようにセットアップするかは、おそらく異なるでしょう。

于 2012-06-29T06:32:14.437 に答える
0

DinnerParty は Nancy と RavenDB への NerdDinner のポートであり、最近 Ayende によってここでレビューされましたhttp://ayende.com/blog/156609/reviewing-dinner-party-ndash-nerd-dinner-ported-to-ravendb-on-ravenhq ?key=0c283ada-e5e8-4b7c-b76b-e9d27bfc0bf9

カスタムモジュールビルダーの使用方法を指摘したことを思い出したので、リクエストごとのセッションを使用していると思います。ブートストラッパーと RavenAwareModuleBuilder を見てください。

于 2012-06-28T21:53:06.393 に答える