私は Autofac を IoC コンテナーとして使用し、MediatR をメディエーターとして使用して要求とコマンドを実行する WCF プロジェクトに取り組んでいます。
WCF コントラクトの "基本" 実装はIMediator
、依存関係として のインスタンスを受け取り、各要求に関連付けられた作業を関連付けられたハンドラーに委任します。また、承認やエラー処理などの基本実装を積み重ねるデコレーターもいくつかあります。
Autofac ドキュメント のこのページで指定されているMultitenantServiceImplementationDataProvider
ように、サービス実装でデコレータを使用する場合、WCF 内部を満たすためにa を使用する必要があります。マルチテナント関連はこれ以上必要ないため、次のものだけで構成されます。
AutofacServiceHostFactory.ServiceImplementationDataProvider = new MultitenantServiceImplementationDataProvider();
また、.svc
Autofac でサポートされているため、インターフェイスの修飾名を指定し、基本実装の上にデコレータを配置しました。
では、MediatR に進みます。
MediatR は、サービスの場所を使用して、要求が与えられたときに適切なハンドラーをインスタンス化します。より具体的には、 CSLに依存しています。
Autofac はCSL をサポートするためのブリッジを提供するため、問題ありません。
「トリッキーな」部分は、私のハンドラーがDbContext
依存関係を持っているという事実に依存しており、各 WCF 要求の後に Autofac によって破棄されます。
したがって、AutofacServiceLocator
ルート スコープは破棄されず、インスタンスにもならないため、特定のリクエスト用に作成されたスコープを に指定する必要がありDbContext
ます。
Autofacでは、ASP.NET MVCAutofacInstanceContext.Current
の に相当する static プロパティを使用できます。
これまでのところ、依存関係を取るクラスを登録する方法は次のとおりです。AutofacDependencyResolver.RequestLifetimeScope
ServiceLocatorProvider
Mediator
builder
.Register(x => new ServiceLocatorProvider(() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)))
.InstancePerLifetimeScope();
開発ボックスでは期待どおりに動作しますがNullReferenceException
、ステージング環境では .
両方の環境と異なる点のみ:
- 私のボックスのHTTPとステージング環境のHTTPS。
debug
要素の属性が<system.web>
ステージング環境で false に設定されていました。
それだけです...
.NET フレームワークも同じ 4.5.2.
誰にもアイデアがありますか?ありがとう!