2017-11-01 10 views
0

TL; 일부 속성은 필요할 때 서비스에 주입되지 않습니다. Nservicebus는 어떻게 structuremap에서 중첩 된 컨테이너를 처리합니까?Nservicebus는 어떻게 structuremap에서 중첩 된 컨테이너를 처리합니까?

안녕 얘들 아 여기. 현재 NSB6 프로젝트로 업그레이드 중입니다. Structuremap과의 종속성 주입에 대해 몇 가지 질문이 있습니다.

우리는 핸들러 내부에서 호출하는 ISendOnlyBus를 사용하는 일부 서비스를 제공합니다. 테스트 용으로 (나는 핸들러가 작동하도록하고 싶다) IMessageHandlerContext로 바꾸었다. 그리고 핸들러의 시작 부분에서 컨테이너에 컨텍스트를 삽입하고있다. 예상대로 작동하지만 IMessageHandlerContext는 이러한 서비스에서 해결되고 사용할 수 있습니다.

public class MyMessageHandler : IHandleMessage<IMyMessage> 
{ 
    private IContainer _container; 
    private ISomeService _someService; 
    public MyMessageHandler (IContainer container, ISomeService someService) 
    { 
     _container = container; 
     _someService = someService; 
    } 

    public async Task Handle(IMyMessage message, IMessageHandlerContext context) 
    { 
     _container.Inject(typeof(IMessageHandlerContext), context); 
     _someService.DoSomething(); 
    } 
} 

public class SomeService : ISomeService 
{ 
    private IMessageHandlerContext _context; 
    public SomeService(IMessageHandlerContext context) 
    { 
     _context = context; 
    } 
    public void DoSomething() 
    { 
     _context.Send<ISomeMessage>(x => { 
      //... init message 
     }); 
    } 
} 

이제 문제는 우리가 nservicebus 메시지를 전송하는 엔티티 통해 NHibernate에 사용자 정의 IPostUpdateEventListener을 가지고있다. 버전 5에서는 다른 서비스와 마찬가지로 ISendOnlyEndpoint가 전송에 사용되지만 이번에는 Structuremap에 의해 컨텍스트가 해석되지 않습니다. nservicebus가 메시지 처리기 내부에서 중첩 된 컨테이너를 관리하는 방법과 궁금한 점이 있습니다. 나는 그것에 대한 어떤 문서를 찾을 수없는 것 같습니다.

+0

StructureMap에서 작동하지 않습니다. 공개 된 문제는 다음과 같습니다. https://github.com/Particular/NServiceBus.StructureMap/issues/52 –

답변

0

나는이의 제안 리팩토링은

public class MyMessageHandler : IHandleMessage<IMyMessage> 
{ 

    public async Task Handle(IMyMessage message, IMessageHandlerContext context) 
    { 
     context.Resolve<ISomeService>().DoSomething(context); 
    } 
} 

public class SomeService : ISomeService 
{ 
    public void DoSomething(IMessageHandlerContext context) 
    { 
     context.Send<ISomeMessage>(x => { 
      //... init message 
     }); 
    } 
} 

context.Resolve

당신이 컨텍스트 인스턴스의 컨테이너 인스턴스에 액세스하는 데 쓰는 연장이 될 것이다 것 같은데요.

그러나 메시지 처리기 외부에서 메시지를 보내려면 버스를 시작할 때 IEndpointInstance 또는 IMessageSession을 입력하면됩니다. 그들은 메시지 처리기에서 보낸 메시지를 컨텍스트를 사용하여 보낼 것을 제안한다고 생각하지만 때로는 작동하지 않는 경우도 있습니다.

1

StructureMap 내의 하위 컨테이너는 NServiceBus 컨테이너에 필요한 일부 기능을 지원하지 않습니다. 정책은 주입을 구성하는 데 사용되고 정책은 하위 컨테이너에서 지원되지 않습니다.

Policies are only applied to root container in StructureMap

Here 그것을 추적 할 수있는 NServiceBus.StructureMap의 환매 특약의 문제입니다.