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

标签 c# wcf autofac nservicebus

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

的对象的两个实例

背景:
我正在使用 Autofac.Integration.WCF(通过为每个 WCF 请求提供一个新的子作用域,这使得一切都“按请求”解析)

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

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

我假设,这是因为 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 消息处理程序处理,该处理程序可以发送/发布多条消息并具有您需要的更改器行为(每个工作单元的单个实例)。

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

https://github.com/ramonsmits/wcfnsbtest

关于c# - 有没有办法将子容器传递到 NserviceBus 管道中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30023217/

相关文章:

testing - 如何使用 Autofac 正确配置模拟依赖项以测试 Web Api (ASP.NET Core) Controller

c# - 检测 IEnumerable<T> 是否已分组,我在检查类型时得到了一些疯狂的结果

c# - "The remote server returned an error: (417) Expectation Failed."

c# - 如何从不同的类写入 DataGridView

c# - 缓存 ASP.NET AJAX 服务 javascript 代理

c# - 在哪里处理 DTO<-> 业务对象转换

c# - Autofac 不会自动将属性连接到自定义类

c# - Fluent Validation 不接受带有千位分隔符的数字

c# - 无法序列化类型为 System.Collections.Generic.Dictionary`2 的成员 ...,因为它实现了 IDictionary

c# - 在 AUTOFAC 中对同一接口(interface)使用不同的 JSON 配置文件