Как избавиться от 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.

Другие вопросы по тегам