10

2 つのサービス コントラクトを実装する WCF サービスがあります...

public class MyService : IService1, IService2

そして、私はサービスをセルフホスティングしています...

host = new ServiceHost(typeof(MyService));

サービスが 1 つのサービス コントラクトのみを実装している場合はすべて正常に機能していましたが、次のように両方を登録するように autofac を設定しようとすると、次のようになります。

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

... 2 番目のもので例外をスローし、次のように報告します。

コレクションに同じタイプの項目が既に含まれているため、値をコレクションに追加できませんでした: 'Autofac.Integration.Wcf.AutofacDependencyInjectionServiceBehavior'。このコレクションは、各タイプのインスタンスを 1 つだけサポートします。

一見したところ、これは私の 2 つのコントラクトが何らかの形で同じタイプと見なされていると言っていると思いましたが、2 回目の読み取りでは、AutofacDependencyInjectionServiceBehavior が問題のタイプであると言っていると思います。つまり、2 回使用することはできません!

それでも、わずかに異なる形式で複数回使用することを明示的に示した次の投稿を見つけました。

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

残念ながら、それはまったく同じエラーメッセージを出しました。

1 つのサービスに複数のサービス契約を登録することは可能ですか。

4

2 に答える 2

7

実際、Autofac を使用すると、1 つのホストに対して複数のエンドポイントを登録できます。

複数を追加することはできませんAutofacDependencyInjectionServiceBehaviorが、この動作はすべてのエンドポイントを反復処理し、ApplyDispatchBehaviorメソッドに登録します。

これを機能させるには、サービスを登録する必要がありますAsSelf()

builder.RegisterType<MyService>();

次に、エンドポイントを通常どおりに構成できます。

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

AddDependencyInjectionBehaviorそして最後に、 servicehost タイプ自体でを呼び出す必要があります。

host.AddDependencyInjectionBehavior<MyService>(container);

これは、この動作を示す小さなサンプル プロジェクト(ドキュメントに基づく) です。

于 2013-08-09T18:34:26.163 に答える
0

@nemesvの回答に基づいて更新(太字のテキスト):

さらに調査した結果、autofac では、WCF サービス コントラクトを登録する場合、単一の ServiceHost に複数のエンドポイントを登録できないことが明らかになりました。(正しい方法については、@ nemesvの回答を参照してください。)

理由は次のとおりです。

この拡張メソッドのいずれかの形式...

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

... ServiceBehavior を追加することで解決します ( autofacでの WCF 統合に関するAlex Meyer-Gleavesの最初の発表によると)...

host.Description.Behaviors.Add(behavior);

現在、このBehaviorsプロパティはKeyedByTypeCollection<TItem>のインスタンスであり、特定の型のオブジェクトを 1 つだけ保持できます。追加される動作は常に のインスタンスであるAutofacDependencyInjectionServiceBehaviorため、追加できるエンドポイントは 1 つだけです。

QED

回避策は、それぞれが 1 つのエンドポイントを持つ複数の ServiceHost を使用することです。

(興味深い点として、これら 2 つのアプローチの間のパフォーマンスとスケーラビリティへの影響を知りたいです。)

于 2013-08-09T17:16:38.247 に答える