Это в среде веб-приложения:
Первоначальный запрос может быть успешно завершен, однако любые дополнительные запросы возвращают ответ «Session is Closed» из среды NHibernate. Я использую подход HttpModule со следующим кодом:
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 - моя одноэлементная реализация, использующая FluentNHibernate для возврата объекта ISessionFactory.
В моем классе репозитория я пытаюсь использовать следующий синтаксис:
public class MyObjectRepository : IMyObjectRepository
{
public MyObject GetByID(int id)
{
using (ISession session = SessionFactory.Instance.GetCurrentSession())
return session.Get<MyObject>(id);
}
}
Это позволяет коду в приложении называться так:
IMyObjectRepository repo = new MyObjectRepository();
MyObject obj = repo.GetByID(1);
У меня есть подозрение, что виноват мой код репозитория, но я не уверен на 100% в фактической реализации, которую я должен использовать.
Я нашел похожую проблему на SO здесь . Я также использую WebSessionContext в своей реализации, однако, не было предложено никакого решения, кроме написания собственного SessionManager. Для простых операций CRUD требуется ли пользовательский поставщик сеансов, кроме встроенных инструментов (например, WebSessionContext)?