Vraiment, ma question est dans le titre ... Comment devrait-on gérer la session NHibernate à Nancy pour une session-par-requête? Si vous avez une bonne réponse pour cela en soi, foncez ... si vous avez besoin de plus de fond, la voici:Comment la session NHibernate doit-elle être gérée dans Nancy pour une session-par-requête?
Je suis habitué à utiliser un ActionFilter dans ASP.NET MVC ouvrir et fermer une session dans le contexte NHibernate au début et à la fin d'une requête Web. Ainsi, chaque opération de base de données dans le contexte d'une requête utilise la même session.
Je pensais que j'avais le même type de configuration dans mon nouveau projet utilisant Nancy, mais chaque fois qu'une session est nécessaire, une nouvelle est générée. Voilà comment je manipuler l'ouverture et la fermeture de la session dans mon programme d'amorçage (héritant de 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());
}
Mon ISessionContainer
est basé sur quelque chose de similaire à this site. Mon implémentation de ISessionContainer
utilise le contexte de session de NHibernate pour obtenir la "session en cours".
À l'heure actuelle, lorsque j'essaie cela dans mon projet Nancy, une nouvelle session est renvoyée chaque fois que la propriété ISessionContainer.Session
est demandée. Je pensais que c'était parce que les sessions basées sur les cookies ne sont pas activés par défaut à Nancy, alors j'ai ajouté à mon bootstrapper:
protected override void ApplicationStartup(IContainer container, IPipelines pipelines)
{
CookieBasedSessions.Enable(pipelines);
}
Pas de dés. Je reçois toujours une nouvelle session à chaque fois en demander un.
Mais, vraiment, je ne veux pas diagnostiquer mon problème. Je préfère entendre quelle est la manière standard de gérer la gestion de session NHibernate à Nancy.
Cela semble excellent. Je vais avec quelque chose comme ça. –
Quelle implémentation de "CurrentSessionContext" utilisez-vous? Avec ThreadStaticSessionContext, il peut sembler que cela fonctionne, mais il s'agit d'une implémentation très fragile et qui se cassera sous une lourde charge si vous utilisez async/Tasks. Autant que je comprenne il n'y a aucune implémentation qui peut même théoriquement traiter des demandes asynchrones dans l'application de Nancy auto-hébergée. –