nhibernate сеанс на запрос в веб-формах asp.net с автофаком - PullRequest
0 голосов
/ 17 февраля 2012

Я ищу способ реализации шаблона сеанса для запроса для управления сеансом nhibernate в веб-формах Asp.net. У меня проблема с сеансом nhibernate в событии Application_EndRequest, потому что она закрыта. Цикл проблемы следующий:
1. Application_BeginRequest - сессия существует, я открываю транзакцию
2. Application_EndRequest - сеанс закрыт, исключение произошло: сеанс был закрыт

Есть идеи, почему это случилось? Я не использую контекст nhibernate, потому что мне нужно внедрить ISession в репозитории.

public class Global : System.Web.HttpApplication, IContainerProviderAccessor, Interfaces.IContainerProvider
{
    // Provider that holds the application container.
    static Autofac.Integration.Web.IContainerProvider _containerProvider;

    // Instance property that will be used by Autofac HttpModules
    // to resolve and inject dependencies.
    public Autofac.Integration.Web.IContainerProvider ContainerProvider
    {
        get { return _containerProvider; }
    }

    public IContainer ApplicationContainer
    {
        get { return _containerProvider.ApplicationContainer; }
    }

    protected void Application_Start(object sender, EventArgs e)
    {
        // Build up your application container and register your dependencies.
        var builder = new ContainerBuilder();
        builder.RegisterModule(new WebsiteModule());
        builder.RegisterInstance(this).As<Interfaces.IContainerProvider>();

        _containerProvider = new ContainerProvider(builder.Build());
        AutofacServiceHostFactory.Container = _containerProvider.ApplicationContainer;
    }

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        ISession session = ContainerProvider.RequestLifetime.Resolve<ISession>();
        session.BeginTransaction();
    }

    private void Application_EndRequest(object sender, EventArgs e)
    {
        ISession session = ContainerProvider.RequestLifetime.Resolve<ISession>();

        if (session != null)
        {
            try
            {
                session.Transaction.Commit();
            }
            catch (Exception)
            {
                session.Transaction.Rollback();
            }
            finally
            {
                session.Close();
            }
        }
    }
}

Я регистрирую NHibernate ISession таким образом:

builder.Register(x => x.Resolve<ISessionFactory>().OpenSession()).As<ISession>().InstancePerLifetimeScope();
...