Как избавиться от NHibernate ISession в приложении ASP.NET MVC
У меня есть NHibernate подключен в моем приложении asp.net MVC.
Все работает нормально, если я не избавляюсь от ISession. Однако я прочитал, что вы должны избавиться, но когда я это сделаю, я получаю случайные исключения "Сессия закрыта".
Я впрыскиваю ISession в другие мои объекты с помощью Виндзора.
Вот мой текущий NHModule:
public class NHibernateHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
context.EndRequest += context_EndRequest;
}
static void context_EndRequest(object sender, EventArgs e)
{
CurrentSessionContext.Unbind(MvcApplication.SessionFactory);
}
static void context_BeginRequest(object sender, EventArgs e)
{
CurrentSessionContext.Bind(MvcApplication.SessionFactory.OpenSession());
}
public void Dispose()
{
// do nothing
}
}
Регистрация ISession:
container
.Register(Component.For<ISession>()
.UsingFactoryMethod(() => MvcApplication.SessionFactory.GetCurrentSession()).LifeStyle.Transient);
Ошибка происходит, когда я прикрепляю Dispose к unbind в модуле. Так как я продолжаю получать сообщение о том, что сессия закрыта, я предполагаю, что это неправильный способ сделать это, так каков правильный путь?
Спасибо джо
3 ответа
Роберт прав, Виндзор избавляется от сеанса, когда он выпускает компоненты, которые зависят от него. Вместо того, чтобы иметь свой собственный HttpModule, я бы порекомендовал использовать стиль жизни Windsor PerWebRequest для ISession.
Кажется, что какой-то объект, содержащий сеанс, удаляется до того, как Виндзор попытается избавиться от сеанса. Быстрое решение состоит в том, чтобы переприменить ваш метод NHiberanteSessionFactory Dispose и проверить, закрыта ли уже сессия.
Я думаю, что эта статья должна помочь: Создание настольного приложения с помощью NHibernate
Теперь я знаю, что это настольное приложение, но вы можете получить вдохновение из этой статьи MSDN.