Nservicebus如何处理结构图上的嵌套容器?

时间:2017-11-01 03:42:34

标签: nservicebus structuremap nservicebus6

TL; DR;某些属性应该在应该注入服务时。 Nservicebus如何处理结构图上的嵌套容器?

嘿,伙计们新来的。我目前正在将我们的项目升级到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如何管理消息处理程序中的嵌套容器。我似乎找不到任何文件。

2 个答案:

答案 0 :(得分:1)

StructureMap中的子容器不支持NServiceBus容器所需的某些功能。策略用于配置注入,子容器不支持策略。

Policies are only applied to root container in StructureMap

Here是NServiceBus.StructureMap repo中的一个问题,用于跟踪它。

答案 1 :(得分: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将是您编写的用于访问上下文实例中的容器实例的扩展。

但是,如果您只想从消息处理程序外部发送消息,则可以注入启动总线时返回的IEndpointInstanceIMessageSession。 我认为他们建议只使用上下文从消息处理程序发送消息 - 但有时候这些消息不起作用。