簡體   English   中英

如何使用autofac注冊兩個WCF服務合同

[英]How to register two WCF service contracts with autofac

我有一個實現兩個服務合同的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);
}

不幸的是,這給出了非常相同的錯誤消息。

一項服務可以注冊多個服務合同嗎?如果可以,如何注冊?

實際上,您可以使用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);

最后,您需要使用sevicehost類型本身調用AddDependencyInjectionBehavior

host.AddDependencyInjectionBehavior<MyService>(container);

這是一個小示例項目 (基於文檔 ),演示了此行為。

根據@nemesv的答案更新(粗體文本):

進一步的調查顯示, 使用autofac, 如果一個人注冊了WCF服務合同, 則無法在單個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,每個ServiceHost都有一個終結點。

(作為一個興趣點,我很想知道這兩種方法之間對性能和可伸縮性的影響。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM