2009-12-24 2 views
1

PerWebRequest 라이프 스타일을 사용하는 Linq2Sql과 관련된 일부 구성 요소를 등록하고 있습니다. 나는 그것들이 생성되는 것을 본다. 그러나 전역의 Application_EndRequest 메쏘드가 호출되기 전에 그것들은 파괴된다. 그게 설계된거야? 누구든지 해결 방법을 알고 있습니까? 모든 요청 끝에 submitanges()에 내 UnitOfWork 객체에 대한 커밋을 호출하려고합니다. Global.asax Application_EndResult를 사용하는 것 외에도 동일한 결과를 가진 IHttpModule을 시도했습니다.성 Windsor PerWebRequest LifeStyle 및 Application_EndRequest

성 2.0을 사용하고 있습니다.

내 물건을 PerWebRequest에 등록하는 방법은 다음과 같습니다. L2S DataContext를 유지하는 DataCOntextProvider 객체를 생성합니다. 그 객체는 UoW에 주입된다. 이제

/// <summary> 
     /// Register the IUnitOfWorkManager to resolve to LinqToSqlUnitOfWorkManager per web request 
     /// </summary> 
     public void RegisterLinq2SqlUnitOfWorkPerWebRequest() 
     { 
      _container.Register(Component.For<IUnitOfWorkManager>() 
       .LifeStyle.PerWebRequest 
       .ImplementedBy<LinqToSqlUnitOfWorkManager>()); 
     } 

    /// <summary> 
    /// Register the IDataContextProvider to resolve to DataContextProvider per web request 
    /// </summary> 
    public void RegisterDataContextProviderPerWebRequest() 
    { 
     _container.Register(Component.For<IDataContextProvider>() 
      .LifeStyle.PerWebRequest 
      .ImplementedBy<DataContextProvider>()); 
    } 

은 단순히이 같은 EndRequest 이벤트에서 (CSL과 윈저 어댑터 모두 1.0이다)을 CommonServiceLocator를 통해 컨테이너에서 UOW를 끌어하려고 :

protected void Application_EndRequest(object sender, EventArgs e) 
    { 
     //ignore unless this is a page (.aspx) or handler (.ashx) 
     if (!RequestCanHaveContext()) 
      return; 

     //get the IUnitOfWork manager 
     var uow = ServiceLocator.Current.GetInstance<IUnitOfWorkManager>(); 

     //if we have one, commit changes at the end of the request 
     if (uow != null) 
     { 
      //don't explicitly dispose of uow or we'll get Disposed exceptions on the context 
      uow.Commit(); 
     } 

    } 

감사합니다, 코리

+0

http://groups.google.com/group/castle-project-users/browse_thread/thread/b8f52a3640ffb654 –

+0

모듈의 최종 요청 처리기가 구성 요소 삭제 전에 실행되는지 확인 했습니까? 또한, 어디에서/어떻게 커널의 ​​파괴 된 사건을 다루고 있습니까? –

답변

0

Application_EndRequest 코드를 httpmodule로 옮기고 을 PerWebRequestLifestyleModule 앞에 등록하십시오.

+0

나는 그것을했다. 나는 매우 이상한 행동으로 끝나고 있습니다 - 일들은 Micro Kernel의 파괴 이벤트를 일으키지 않고 생성/파괴됩니다. 나는 그것이 고통을 일으키는 ASP.NET인지 알지 못한다. –

+0

구성 요소 파괴 전에 모듈의 endrequest 처리기가 실행되는지 확인 했습니까? 또한, 어디에서/어떻게 커널의 ​​파괴 된 사건을 다루고 있습니까? –

1

IUnitOfWorkManager 구현시 IDisposable을 구현하고 Dispose call SubmitChanges에 구현해야합니다. 또는 맞춤형 퇴역을 사용하여 변경 사항을 제출하십시오.

관련 문제