问题:
发送到调用 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 构建了一个示例项目,它演示了工作单元生命周期范围行为:
关于c# - 有没有办法将子容器传递到 NserviceBus 管道中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30023217/