Как избавиться от NHibernate ISession в приложении ASP.NET MVC - PullRequest
3 голосов
/ 25 января 2010

В моем приложении asp.net mvc подключено NHibernate.

Все работает нормально, если я НЕ распоряжаюсь 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 ]

1 голос
/ 28 июля 2010

Роберт прав: Виндзор избавляется от сеанса, когда он выпускает компоненты, которые зависят от него. Вместо того, чтобы иметь свой собственный HttpModule, я бы порекомендовал использовать стиль жизни Windsor PerWebRequest для ISession.

0 голосов
/ 29 января 2010

Думаю, эта статья должна помочь: Создание настольного приложения для работы с NHibernate

Теперь я знаю, что это приложение для настольного компьютера, но вы могли бы вдохновиться этой статьей MSDN.

0 голосов
/ 25 января 2010

Кажется, что какой-то объект, содержащий сеанс, удаляется до того, как Виндзор попытается избавиться от сеанса. Быстрое решение состоит в том, чтобы переприменить ваш метод NHiberanteSessionFactory Dispose и проверить, закрыт ли уже сеанс.

...