2011-08-26 7 views
2

나는 서비스 버스 (MassTransit)에서 메시지를 소비하는 asp.net 프로세스를 보유하고 있습니다. 웹 요청의 경우 데이터베이스 세션은 PerWebRequest 라이프 스타일로 해결됩니다.asp.net 프로세스에 대한 Windsor 복합 라이프 스타일

그러나 프로세스가 MassTransit에서 메시지를 소비하면 HttpContext를 사용할 수 없으므로 데이터베이스 세션에 다른 라이프 스타일이 필요합니다. 이 갈 수있는 올바른 방법 인 경우,

가 가
public class PerRequestLifeStyleManager : ILifestyleManager 
{ 
    readonly PerWebRequestLifestyleManager perWebRequestLifestyleManager; 
    readonly PerThreadLifestyleManager perThreadLifestyleManager; 

    public PerRequestLifeStyleManager() 
    { 
     perWebRequestLifestyleManager = new PerWebRequestLifestyleManager(); 
     perThreadLifestyleManager = new PerThreadLifestyleManager();    
    } 

    public void Init(IComponentActivator componentActivator, IKernel kernel, ComponentModel model) 
    { 
     perWebRequestLifestyleManager.Init(componentActivator, kernel, model); 
     perThreadLifestyleManager.Init(componentActivator, kernel, model); 
    } 

    public object Resolve(CreationContext context) 
    { 
     return GetManager().Resolve(context); 
    } 

    public bool Release(object instance) 
    { 
     return GetManager().Release(instance); 
    } 

    public void Dispose() 
    { 
     GetManager().Dispose(); 
    } 

    ILifestyleManager GetManager() 
    { 
     if (HttpContext.Current != null) 
     { 
      return perWebRequestLifestyleManager; 
     } 

     return perThreadLifestyleManager; 
    } 
} 

사람이 말해 줄 수 :

나는이 만든? 그리고 그렇지 않다면, 무엇입니까?

감사합니다.

편집 : 방금 테스트 한 일부 코드로 질문을 업데이트했습니다 (테스트되지 않았습니다). 윈저의 관점에서 볼 때 이것이 안전하고 건전한 가라면 나는 아직도 열망하고 있습니다.

+1

확인하는 좋은 장소 : 당신이 그 이상으로 뭔가를 주입해야하는 경우

, 당신은 또한 요격을 사용할 수 있습니다. http://groups.google.com/group/masstransit-discuss 드루 (Dru)는 성 (Castle)에 대한 경험이 충분하여 올바른 방향으로 인도 할 수 있다고 생각하지만 분명히하지는 않습니다. 나는 그것을 만지지 않았다;) – Travis

+0

나는 거기에 있었지만 그것을 통해서만 탐색했다. 나는 윈저와 매스 트랜싯 사이의 크로스가 너무 관련이 있다고 생각했다. :) ... 그러나 팁을 주셔서 감사합니다, 나는 거기에 게시 할 것입니다! – asgerhallas

+0

세션 관리에 대한 설명은 다음 페이지를 참조하십시오. http://groups.google.com/group/masstransit-discuss/browse_thread/thread/4be42a6319ce66ff/6f28a2eeea52278a?lnk=gst&q=windsor+lifestyle#6f28a2eeea52278a ... 나는 ' 비록 당신이 커스텀 라이프 스타일을 만드는 방법인지는 알지 못합니다. 콜백 전/후에 콜백을 기반으로합니다 ... – asgerhallas

답변

4

hybrid lifestyles 중 하나를 사용해보세요.

+0

이것은 완벽한, 감사합니다! Composite 대신 Hybrid를 생각해 봤으면 좋겠다. – asgerhallas

+0

castle.windsor 3.0 – maxlego

+0

@maxlego : 예, 하이브리드 라이프 스타일을 Windsor 3.0으로 업그레이드 한 다음 나에게 pull request를 보낸다. –

3

Castle Windsor 확장을 사용하면 소비자 클래스의 생성자에 대한 종속성으로 사용자의 Session을 가질 수 있습니다. 그런 식으로, 컨테이너는 소비자가 MT에 의해 처분되면, Session의 라이프 사이클을 관리하고 처분 할 것입니다.

더 많은 제어가 필요하면 소비자에게 메시지 배달과 관련하여 소비자 클래스 인스턴스의 해결 및 릴리스를 래핑하기 위해 WindsorConsumerFactory가 구현되는 방법을 살펴볼 수 있습니다. MassTransit 메일 링리스트 것,

Unit of work when using MassTransit

+0

답장을 보내 주셔서 감사합니다! 나는 Windsor 확장을 사용하고 있으며 훌륭하게 작동합니다. Before/AfterConsumingMessage 차단 방법은 Windsor 라이프 스타일을 구현하는 가장 쉬운 방법이라고 생각합니다. 그러나 나는 항상 한 번에 하나의 메시지 만 소비하는지 궁금합니다. 그리고 주어진 시간에 전후에 어떤 메시지가 있는지 어떻게 알 수 있습니까? – asgerhallas

+0

수신 된 각 메시지에 대해 새 소비자가 생성되고 릴리스됩니다. Consumer의 Consume 메소드는 소비자의 수명 기간 동안 단일 메시지에 대해 한 번 호출됩니다. 그래서 저는 전형적으로 소비자의 석방으로 처분되는 과도 상태로 Session을 만듭니다. –

+0

확인. 그런데이 스레드에서 oll과 같은 문제가 발생합니다. http://groups.google.com/group/masstransit-discuss/browse_thread/thread/4be42a6319ce66ff/6f28a2eeea52278a?lnk=gst&q=windsor+lifestyle#6f28a2eeea52278a ...의존성 체인에서 더 긴 서비스에 동일한 Session을 제공하기를 원한다는 것을 의미합니다. 메일 링리스트에서 주제를 열어 보겠습니다. – asgerhallas