[英]How to implement session-per-request pattern in asp.net mvc with Nhibernate
I created the nhibernate session in Application_start event of global.asax file,the session is being passed to constructors of service methods. 我在global.asax文件的Application_start事件中创建了nhibernate会话,该会话正在传递给服务方法的构造函数。
In the service method I am using the session to do CRUD operations, this works fine.However, When multiple requests or parallel transactions occuring nhibernate is throwing some exceptions.After reading forums i came to know that Nhibernate session is not thread safe.How to make it thread safe and let my application (ASP.NET mvc) work with parallel trandsactions? 在服务方法中,我使用会话执行CRUD操作,这很好用,但是,当发生多个请求或并行事务时,nhibernate抛出了一些异常。在阅读了论坛后,我知道Nhibernate会话不是线程安全的。使它线程安全,并让我的应用程序(ASP.NET MVC)与并行事务一起工作?
Only way to make it thread safe is to create a new session per each request, you could use current_session_context_class
property to managed_web
in NHibernate config. 使线程安全的唯一方法是为每个请求创建一个新会话,您可以在NHibernate配置中将
current_session_context_class
属性用于managed_web
。
In global.asax 在global.asax中
protected void Application_BeginRequest(object sender, EventArgs e)
{
var session = SessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
}
protected void Application_EndRequest(object sender, EventArgs e)
{
var session = CurrentSessionContext.Unbind(SessionFactory);
//commit transaction and close the session
}
now when you want to access the session, you could use, 现在,当您要访问会话时,可以使用
Global.SessionFactory.GetCurrentSession()
If you are using a DI container, it's usually built into the container, 如果您使用的是DI容器,则通常是内置在该容器中的,
For example for Autofac (see this question for more information), 以Autofac为例(有关更多信息,请参见此问题 ),
containerBuilder.Register(x => {
return x.Resolve<ISessionFactory>().OpenSession();
}).As<ISession>().InstancePerHttpRequest();
Store it in the HttpContext. 将其存储在HttpContext中。
Add this to your global.asax 将此添加到您的global.asax
public static String sessionkey = "current.session";
public static ISession CurrentSession
{
get { return (ISession)HttpContext.Current.Items[sessionkey]; }
set { HttpContext.Current.Items[sessionkey] = value; }
}
protected void Application_BeginRequest()
{
CurrentSession = SessionFactory.OpenSession();
}
protected void Application_EndRequest()
{
if (CurrentSession != null)
CurrentSession.Dispose();
}
And here is the component registration 这是组件注册
public class SessionInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container
.Register(Component.For<ISession>().UsingFactoryMethod(() => MvcApplication.CurrentSession)
.LifeStyle
.PerWebRequest);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.