[英]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.