2009-11-07 5 views
1

메시지 당 인스턴스를 처리하려는 경우 NServiceBus 메시지 처리기와 함께 사용해야하는 필수 IOC 인스턴스 수명주기가 무엇입니까?NServicebus IOC StructureMap의 메시지 처리기 수명주기

PerRequest는 작동하지 않습니다. 수많은 생성자 종속성 및 종속성 그래프가 있기 때문에 Handle (MessageX msg) 호출 당 하나만 필요할 때마다 많은 인스턴스를 제공합니다. 객체 그래프 아래로 더 내려와야하기 때문에 메시지 핸들러에 직접 삽입 할 수 없거나 삽입하고 싶지 않습니다. 예 : IPersonService를 주입하고, IPersonRepository에 의존하며, 요청 당 (기본값) 될 수 있지만 IPersonDBContext는 메시지 호출 당 필요합니다.

NServiceBus가 동일한 작업자 스레드를 반복해서 사용하기 때문에 PerThread가 작동하지 않습니다.

싱글 톤, HttpContext 등은 분명히 적용 할 수 없습니다.

구조 맵 또는 성으로이 문제가 발생한 사람이 있습니까?

답변

1

여기에 뭔가가 누락되었지만 PerRequest가 각 MessageHandler에 대한 새 인스턴스를 제공합니다 (메시지 핸들러는 PerRequest로 등록 됨). 메시지 핸들러가 각 메시지에 대해 여러 번 실행하게하는 버그를 수정했습니다. 그 버그가 당신을 오해의 소지가 된 경우이 도움이

http://teamcity.codebetter.com/viewLog.html?buildId=7087&tab=artifacts&buildTypeId=bt96

희망을 (CI에서 최신 2.0 빌드를받을 수 있도록 당신을 위해 그것을하지 있는지 확인하려고) 궁금해!

+1

내 IMessageHandler 이 IPersonService 및 IAnimalService에 의존하는 경우 True이면 요청 당 constr이 주입됩니다 (대부분의 IOC에 대한 기본값). 그러나 IPersonService와 IAnimalService는 PerRequest에서 IDbContext에 종속됩니다. IDbContext (두 개의 다른 종속성에 대한 것)가 아닌 하나의 IDbContext (두 개의 서비스/repos와 상호 작용하는 경우에도 하나의 ID 만) 웹 컨텍스트에서 IDbContext를 HttpContext로 설정할 수 있으며 웹 이외의 스레드 된 컨텍스트에서 IDbContext per Thread를 설정할 수 있습니다. Handle (msg) 호출마다 하나의 IDbContext를 얻을 수있는 방법을 알 수 없습니다. –

+0

우리가 NServiceBus 내부에서 처리하는 방법은 우리가 ISession이 아닌 ISessionFactory를 주입하는 것입니다. 우리는 세션 팩토리에서 세션의 열기와 닫기를 관리하는 메시지 모듈을 가지고 있으며 모든 응용 코드는 SessionFactory.GetCurrentSession()을 사용합니다. 희망이 있습니다. –

+0

우디, 이거 끔찍 하네! 나는 3.0을 기다릴 수 없다. – JarrettV

관련 문제