有没有办法将子容器传递到 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 构建了一个示例项目,它演示了工作单元生命周期范围行为:
已修改 NServiceBus.Autofac
object builder 以通过工厂启用子作用域解析。
ILifetimeScope
工厂 returns 一个 AutofacInstanceContext.Current.OperationLifetime
是 WCF 使用的子容器。
问题:
发送到调用 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 构建了一个示例项目,它演示了工作单元生命周期范围行为:
已修改 NServiceBus.Autofac
object builder 以通过工厂启用子作用域解析。
ILifetimeScope
工厂 returns 一个 AutofacInstanceContext.Current.OperationLifetime
是 WCF 使用的子容器。