10

我有一个实现两个服务合同的 WCF 服务......

public class MyService : IService1, IService2

我正在自行托管服务...

host = new ServiceHost(typeof(MyService));

当服务只实现一个服务合同时,一切都运行良好,但是当我尝试设置 autofac 以像这样注册两者时:

host.AddDependencyInjectionBehavior<IService1>(_container);
host.AddDependencyInjectionBehavior<IService2>(_container);

...它在第二个上引发异常,报告:

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

乍一看,我以为这是在说我的两个合同不知何故被视为同一类型,但在第二次阅读时,我相信它是说 AutofacDependencyInjectionServiceBehavior 是有问题的类型,即我不能使用它两次!

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

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

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

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

4

2 回答 2

7

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

确实,您不能添加多个AutofacDependencyInjectionServiceBehavior,但是这种行为会遍历所有端点并将它们注册到ApplyDispatchBehavior方法中:source

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

builder.RegisterType<MyService>();

然后你就可以正常配置你的端点了:

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

最后,您需要AddDependencyInjectionBehavior使用服务主机类型本身调用 :

host.AddDependencyInjectionBehavior<MyService>(container);

这是一个演示此行为的小型示例项目(基于文档)。

于 2013-08-09T18:34:26.163 回答
0

根据@nemesv 的回答更新(粗体文本):

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

原因如下:

这种扩展方法的任何一种形式......

host.AddDependencyInjectionBehavior<IService1>(_container);
host.AddDependencyInjectionBehavior(t, container);

...解决添加一个 ServiceBehavior(根据 Alex Meyer-Gleaves在 autofac中集成 WCF 的初步公告)...

host.Description.Behaviors.Add(behavior);

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

量子点

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

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

于 2013-08-09T17:16:38.247 回答