How to implement session-per-request pattern in asp.net mvc with Nhibernate

前端 未结 2 1669
陌清茗
陌清茗 2020-12-07 06:00

I created the nhibernate session in Application_start event of global.asax file,the session is being passed to constructors of service methods.

In the service method

2条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-07 06:20

    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.

    In 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,

    For example for Autofac (see this question for more information),

    containerBuilder.Register(x => {
        return x.Resolve().OpenSession(); 
    }).As().InstancePerHttpRequest();
    

提交回复
热议问题