确实,我的问题是标题...对于每个请求的会话,应如何在Nancy中处理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基于类似于this site的东西。我的ISessionContainer实现使用NHibernate的会话上下文来获取“当前会话”。

现在,当我在Nancy项目中尝试此操作时,每次请求ISessionContainer.Session属性都将返回一个新会话。我以为是因为在Nancy中默认不启用基于cookie的会话,所以我将其添加到了我的引导程序中:

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


没有骰子。每次要求我开会时,我仍然有一个新的会话。

但是,实际上,我不想诊断我的问题。我宁愿听到在Nancy中处理NHibernate会话管理的标准方法是什么。

最佳答案

在我的Nancy port of the RestBucks sample中,我按请求的方式使用NHibernate。

bootstrapper from that sample中,我具有以下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会话可能会有所不同。

关于c# - 对于每个请求的 session ,应如何在Nancy中处理NHibernate session ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11253126/

10-16 22:22