真的,我的问题在于标题......如何在Nancy处理NHibernate会话以进行会话请求?如果你自己有一个很好的答案,那就去吧......如果你需要更多的背景,那就是:
我习惯于在ASP.NET MVC中使用actionFilter在Web请求的开头和结尾处打开和关闭NHibernate上下文中的会话。这样,请求上下文中的每个数据库操作都使用相同的会话。
我认为我在使用Nancy的新项目中设置了同样的东西,但每次需要会话时,都会生成一个新会话。以下是我在bootstrapper中处理会话的打开和关闭的方法(继承自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);
}
没有骰子。每次要求我都会给我一个新的会议。
但是,实际上,我不想诊断我的问题。我宁愿听听在南希处理NHibernate会话管理的标准方法。
答案 0 :(得分:4)
在我的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会话可能会有所不同。
答案 1 :(得分:0)
DinnerParty是NerdDinner与Nancy和RavenDB的一个端口,最近由Ayende审核http://ayende.com/blog/156609/reviewing-dinner-party-ndash-nerd-dinner-ported-to-ravendb-on-ravenhq?key=0c283ada-e5e8-4b7c-b76b-e9d27bfc0bf9
我相信它使用每个请求会话,因为我记得指出如何使用自定义模块构建器。看一下bootstrapper和RavenAwareModuleBuilder