有没有办法将子容器传递到 NserviceBus 管道中?

Is there a way to pass a child container into the NserviceBus pipeline?

问题:
发送到调用 IBus.SendLocal 的 WCF 服务的请求创建配置为 InstancePerLifetimeScope()

的对象的两个实例

背景:
我正在使用 Autofac.Integration.WCF(通过为每个 WCF 请求提供一个新的子作用域来解决所有问题 'per request')

IBus.SendLocal 调用消息修改器,注入与 wcf 服务相同的资源类型

但是,创建了两个不同的实例。一个被注入到服务中,一个不同的实例被注入到消息修改器中。

我假设,这是因为 NSB 创建了自己的基于根容器的子作用域。

任何 ideas/pointers 如何解决这个问题(即每个 WCF 请求只创建一个实例)?

编辑:使用 NSB 4.3.2 和 Autofac 3.5.2

简化配置代码

  Autofac.IContainer container = ConfigureIoc();

  Configure
    .With(AllAssemblies.Matching("this.dll").And("that.dll"))
    .DefineEndpointName("endpoint name here")
    .AutofacBuilder(container)
    .MsmqSubscriptionStorage()
    .UnicastBus()
    .CreateBus()
    .Start();

  ServiceHost host = CreateHost();
  host.AddDependencyInjectionBehavior(typeof(ISomeContract), container);
  host.Open();

当 NServiceBus 收到消息时,会创建一个子容器。在您的场景中,call/message 不是由 NServiceBus 接收的,而是由 WCF 接收的。您随后进行的所有调用都将使用初始化 NServiceBus 时创建的根容器。

通过 Autofac 注册

builder.RegisterType<MyMutator>().AsImplementedInterfaces().AsSelf().InstancePerLifetimeScope();

通过 NServiceBus 注册

busConfiguration.RegisterComponents(x => x.ConfigureComponent<MyMutator>(DependencyLifecycle.InstancePerUnitOfWork));

当前 (v5) 无法在调用 Bus.SendLocal 而不是在 NService 端点上接收消息的上下文中创建子容器。

一个解决方案是将 WCF 调用转换为 一个 消息并执行本地发送。然后处理此消息的 NServiceBus 消息处理程序可以执行 sending/publishing 多条消息并具有您需要的增变器行为(每个工作单元的单个实例)。

我已经使用 WCF 和 NServiceBus 构建了一个示例项目,它演示了工作单元生命周期范围行为:

https://github.com/ramonsmits/wcfnsbtest

已修改 NServiceBus.Autofac object builder 以通过工厂启用子作用域解析。

ILifetimeScope 工厂 returns 一个 AutofacInstanceContext.Current.OperationLifetime 是 WCF 使用的子容器。

https://github.com/Particular/NServiceBus.Autofac/pull/2