问题:
发送到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构建了一个示例项目,它演示了工作生命周期范围行为: