Я ищу способ реализации шаблона сеанса для запроса для управления сеансом 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();