【问题标题】:How does Nservicebus handle nested containers on structuremap?Nservicebus 如何处理结构图上的嵌套容器?
【发布时间】:2018-04-13 08:37:47
【问题描述】:

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 如何以及是否管理消息处理程序中的嵌套容器。我似乎找不到任何文档。

【问题讨论】:

标签: nservicebus structuremap nservicebus6


【解决方案1】:

我猜建议的重构是

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,它们会在您启动总线时返回。 我认为他们建议只使用上下文从消息处理程序发送消息 - 但有时这不起作用。

【讨论】:

    【解决方案2】:

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

    Policies are only applied to root container in StructureMap

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-23
      • 2016-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多