真的,我的问题就在标题中...... NHibernate 会话应该如何在 Nancy 中处理,以便按请求进行会话?如果您对此本身有一个很好的答案,那就去做吧……如果您需要更多背景知识,那就是:
我习惯于在 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
的基于类似于此站点的内容。我的实现ISessionContainer
使用 NHibernate 的会话上下文来获取“当前会话”。
现在,当我在我的 Nancy 项目中尝试这个时,每次ISessionContainer.Session
请求属性时都会返回一个新会话。我认为这是因为 Nancy 默认情况下未启用基于 cookie 的会话,所以我将其添加到我的引导程序中:
protected override void ApplicationStartup(IContainer container, IPipelines pipelines)
{
CookieBasedSessions.Enable(pipelines);
}
没有骰子。每次要求一个新的会话时,我仍然会得到一个新的会话。
但是,真的,我不想诊断我的问题。我宁愿听听在 Nancy 中处理 NHibernate 会话管理的标准方法是什么。