c# – 有没有办法将子容器传递到NserviceBus管道?

问题:

发送到WCF服务的请求(调用IBus.SendLocal)会创建一个配置为InstancePerLifetimeScope()的对象的两个实例

背景:
我正在使用Autofac.Integration.WCF(它通过为每个WCF请求提供一个新的子范围,使每个请求解析’每个请求’)

IBus.SendLocal调用消息mutator,它使用与wcf服务相同的资源类型注入

但是,会创建两个不同的实例.一个注入到服务中,一个不同的实例被注入到消息mutator中.

我假设,这是因为NSB创建了自己的子范围,它基于根容器.

任何想法/指针如何解决这个问题(即每个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收到消息时会创建子容器.在您的方案中,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消息处理程序,然后该处理程序可以发送/发布多个消息并具有您需要的mutator行为(每个工作单元的单个实例).

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

https://github.com/ramonsmits/wcfnsbtest

点赞