Dies ist in einer Webanwendungsumgebung:"Sitzung ist geschlossen!" - NHibernate
Eine erste Anfrage kann erfolgreich abgeschlossen werden, aber alle zusätzlichen Anfragen geben eine "Sitzung ist geschlossen" -Antwort vom NHibernate-Framework zurück. Ich bin mit einem Httpmodule Ansatz mit dem folgenden Code:
public class MyHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.EndRequest += ApplicationEndRequest;
context.BeginRequest += ApplicationBeginRequest;
}
public void ApplicationBeginRequest(object sender, EventArgs e)
{
CurrentSessionContext.Bind(SessionFactory.Instance.OpenSession());
}
public void ApplicationEndRequest(object sender, EventArgs e)
{
ISession currentSession = CurrentSessionContext.Unbind(
SessionFactory.Instance);
currentSession.Dispose();
}
public void Dispose() { }
}
SessionFactory.Instance meine Singleton-Implementierung ist, mit FluentNHibernate ein ISessionFactory Objekt zurückzukehren.
In meiner Repository-Klasse, versuche ich, die folgende Syntax zu verwenden:
public class MyObjectRepository : IMyObjectRepository
{
public MyObject GetByID(int id)
{
using (ISession session = SessionFactory.Instance.GetCurrentSession())
return session.Get<MyObject>(id);
}
}
Dies ermöglicht Code in der Anwendung als solche genannt werden:
IMyObjectRepository repo = new MyObjectRepository();
MyObject obj = repo.GetByID(1);
Ich habe den Verdacht, meinen Repository Code ist schuld, aber ich bin mir nicht 100% ig sicher, welche Implementierung ich eigentlich verwenden sollte.
Ich fand ein ähnliches Problem auf SO here. Ich verwende auch WebSessionContext in meiner Implementierung, jedoch wurde keine andere Lösung als das Schreiben eines benutzerdefinierten SessionManagers bereitgestellt. Ist für einfache CRUD-Vorgänge ein benutzerdefinierter Sitzungsanbieter erforderlich, der von den integrierten Tools (z. B. WebSessionContext) entfernt ist?