如何使用autofac注册两个WCF服务合同

我有一个WCF服务,实现了两个服务合同……

public class MyService : IService1, IService2 

我自我托管服务……

 host = new ServiceHost(typeof(MyService)); 

当服务只实现一个服务合同时,一切都工作正常,但是当我尝试设置autofac来注册这两个时:

 host.AddDependencyInjectionBehavior(_container); host.AddDependencyInjectionBehavior(_container); 

…它在第二个引发exception,报告:

该值无法添加到集合中,因为该集合已包含相同类型的项:’Autofac.Integration.Wcf.AutofacDependencyInjectionServiceBehavior’。 此集合仅支持每种类型的一个实例。

乍一看,我认为这是说我的两个合同在某种程度上被视为相同的类型,但在二读时我相信它是说AutofacDependencyInjectionServiceBehavior是有问题的类型,即我不能使用它两次!

然而,我发现这篇文章明确显示多次使用它的forms略有不同:

 foreach (var endpoint in host.Description.Endpoints) { var contract = endpoint.Contract; Type t = contract.ContractType; host.AddDependencyInjectionBehavior(t, container); } 

不幸的是,这给出了同样的错误信息。

是否可以在一项服务上注册多个服务合同,如果是,如何?

实际上,您可以使用Autofac为单个主机注册多个端点。

确实,您无法添加多个AutofacDependencyInjectionServiceBehavior但此行为会遍历所有端点并在ApplyDispatchBehavior方法中注册它们: source

为了完成这项工作,您需要注册您的服务AsSelf()

 builder.RegisterType(); 

然后您可以正常配置端点:

 host = new ServiceHost(typeof(MyService)); host.AddServiceEndpoint(typeof(IService1), binding, string.Empty); host.AddServiceEndpoint(typeof(IService2), binding, string.Empty); 

最后,您需要使用sevicehost类型本身调用AddDependencyInjectionBehavior

 host.AddDependencyInjectionBehavior(container); 

这是一个小示例项目 (基于文档 ),它演示了这种行为。

根据@ nemesv的答案更新(粗体文字):

进一步的调查显示, 如果注册WCF服务合同使用autofac 就无法在单个ServiceHost上注册多个端点。 (请参阅@ nemesv的答案,了解正确的方法。)

原因如下:

这种扩展方法的任何一种forms……

 host.AddDependencyInjectionBehavior(_container); host.AddDependencyInjectionBehavior(t, container); 

…解析为添加ServiceBehavior(根据Alex Meyer-Gleaves在autofac中首次公布WCF集成 )…

 host.Description.Behaviors.Add(behavior); 

现在,此Behaviors属性是KeyedByTypeCollection 的实例,它只能包含给定类型的一个对象。 由于添加的行为将始终是AutofacDependencyInjectionServiceBehavior的实例,因此只能添加一个端点。

QED

解决方法是使用多个ServiceHost,每个ServiceHost都有一个端点。

(作为一个兴趣点,我很想知道这两种方法对性能和可扩展性的影响。)