2016-06-17 2 views
0

global.asax 파일의 Application_start 이벤트에 nhibernate 세션을 만들었습니다.이 세션은 service 메소드의 생성자에 전달됩니다.Nhibernate와 함께 asp.net mvc에서 세션 당 요청 패턴을 구현하는 방법

서비스 방법에서 CRUD 작업을 수행하는 데 세션을 사용하고 있습니다. 그러나 여러 요청 또는 nhibernate가 발생하는 병렬 트랜잭션이 몇 가지 예외를 던지고 있습니다. 포럼을 읽은 후 Nhibernate 세션이 스레드가 아니라는 것을 알게되었습니다 스레드 안전하고 어떻게 내 응용 프로그램 (ASP.NET MVC) 병렬 trandsactions 함께 작동하도록 safe.How?

답변

0

HttpContext에 저장하십시오.

여기 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(); 
    } 

을이를 추가하는 구성 요소의 등록을 안전하게 스레드 수 있도록

public class SessionInstaller : IWindsorInstaller 
{ 
    public void Install(IWindsorContainer container, IConfigurationStore store) 
    { 
     container 
      .Register(Component.For<ISession>().UsingFactoryMethod(() => MvcApplication.CurrentSession) 
      .LifeStyle 
      .PerWebRequest); 
    } 
} 
+0

세션을 httpcontext에 저장하면 데이터 액세스 계층 프로젝트에서 어떻게 액세스 할 수 있습니까? Dependency Injection.please advice – Raghu

+1

을 사용하지 않고 있습니다. 두 가지를 혼동하고 있습니다. 1. Application_Start에서 세션을 시작하고 들어오는 모든 사용자에 대해 세션을 사용할 수 없습니다. Application_BeginRequest에서 세션을 시작하는 이유가 여기에 있습니다. http 요청에 대한 세션의 범위를 지정하려고합니다. 2. 세션을 여러 스레드에서 업데이트하지 않으려는 경우 스레드가 스레드로부터 안전 할 필요는 없습니다. Application_Start에서 SessionFactory를 빌드하려고합니다. – Fran

+0

DI를 사용하지 않는 경우 MvcApplication.CurrentSession을 컨트롤러 생성자 – Fran

0

유일한 방법입니다 당신이 수, 각 요청마다 새로운 세션을 생성하는 것입니다 NHibernate 설정에서 current_session_context_class 속성을 managed_web에 사용하십시오. 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 
    } 

세션을 액세스 할 때 지금, 당신이 사용할 수에

,

Global.SessionFactory.GetCurrentSession() 

당신이 DI 컨테이너를 사용하는 경우 , 그것은 일반적으로, 컨테이너에 내장 Autofac (자세한 내용 this question 참조) 예를 들어

,

01,
+0

에 종속성 삽입을 사용하지 않고 전달하십시오. 어떻게 global.asax에서 데이터 액세스 계층으로 세션을 가져올 수 있습니까? – Raghu

+0

Global.SessionFactory.GetCurrentSession() –

+0

데이터 액세스 계층이 다른 프로젝트에 있다면? 그것을 액세스하는 방법. – Raghu

관련 문제