如何使用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都有一个端点。
(作为一个兴趣点,我很想知道这两种方法对性能和可扩展性的影响。)