gpt4 book ai didi

c# - Nancy 中的 NHibernate session 应该如何针对每个请求的 session 进行处理?

转载 作者:行者123 更新时间:2023-11-30 21:06:23 24 4
gpt4 key购买 nike

真的,我的问题在标题中... NHibernate session 应该如何在 Nancy 中处理以实现每个请求的 session ?如果您对此有一个很好的答案,那就去做吧……如果您需要更多背景知识,请看这里:


我习惯于在 ASP.NET MVC 中使用 actionFilter 在 Web 请求的开始和结束时在 NHibernate 上下文中打开和关闭 session 。这样,请求上下文中的每个数据库操作都使用相同的 session 。

我以为我在使用 Nancy 的新项目中设置了同样的东西,但每次需要一个 session 时,都会生成一个新的 session 。以下是我如何在我的 Bootstrap 中处理 session 的打开和关闭(继承自 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 的 session 上下文来获取“当前 session ”。

现在,当我在 Nancy 项目中尝试此操作时,每次请求 ISessionContainer.Session 属性时都会返回一个新 session 。我认为这是因为在 Nancy 中默认情况下未启用基于 cookie 的 session ,所以我将其添加到我的 Bootstrap 中:

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

没有骰子。每次要求时,我仍然会得到一个新的 session 。

但是,说真的,我不想诊断我的问题。我更愿意听听在 Nancy 中处理 NHibernate session 管理的标准方法是什么。

最佳答案

在我的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 session 的确切方式可能会有所不同。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com