1

私は Autofac を IoC コンテナーとして使用し、MediatR をメディエーターとして使用して要求とコマンドを実行する WCF プロジェクトに取り組んでいます。

WCF コントラクトの "基本" 実装はIMediator、依存関係として のインスタンスを受け取り、各要求に関連付けられた作業を関連付けられたハンドラーに委任します。また、承認やエラー処理などの基本実装を積み重ねるデコレーターもいくつかあります。

Autofac ドキュメント のこのページで指定されているMultitenantServiceImplementationDataProviderように、サービス実装でデコレータを使用する場合、WCF 内部を満たすためにa を使用する必要があります。マルチテナント関連はこれ以上必要ないため、次のものだけで構成されます。

AutofacServiceHostFactory.ServiceImplementationDataProvider = new MultitenantServiceImplementationDataProvider();

また、.svcAutofac でサポートされているため、インターフェイスの修飾名を指定し、基本実装の上にデコレータを配置しました。

では、MediatR に進みます。
MediatR は、サービスの場所を使用して、要求が与えられたときに適切なハンドラーをインスタンス化します。より具体的には、 CSLに依存しています。

Autofac はCSL をサポートするためのブリッジを提供するため、問題ありません。
「トリッキーな」部分は、私のハンドラーがDbContext依存関係を持っているという事実に依存しており、各 WCF 要求の後に Autofac によって破棄されます。
したがって、AutofacServiceLocatorルート スコープは破棄されず、インスタンスにもならないため、特定のリクエスト用に作成されたスコープを に指定する必要がありDbContextます。

Autofacでは、ASP.NET MVCAutofacInstanceContext.Currentの に相当する static プロパティを使用できます。 これまでのところ、依存関係を取るクラスを登録する方法は次のとおりです。AutofacDependencyResolver.RequestLifetimeScope
ServiceLocatorProviderMediator

builder
    .Register(x => new ServiceLocatorProvider(() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)))
    .InstancePerLifetimeScope();

開発ボックスでは期待どおりに動作しますがNullReferenceException、ステージング環境では .

両方の環境と異なる点のみ:

  • 私のボックスのHTTPとステージング環境のHTTPS。
  • debug要素の属性が<system.web>ステージング環境で false に設定されていました。

それだけです...
.NET フレームワークも同じ 4.5.2.

誰にもアイデアがありますか?ありがとう!

4

1 に答える 1

1

変更して修正しました:

builder
    .Register(x => new ServiceLocatorProvider(() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)))
    .InstancePerLifetimeScope();

builder
    .Register(x => 
    {
        var serviceLocator = new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime);
        return new ServiceLocatorProvider(() => serviceLocator);
    }
    .InstancePerLifetimeScope();

うまくいかなかった理由を正確に説明することはできませんが、ラムダ式() => new AutofacServiceLocator(AutofacInstanceContext.Current.OperationLifetime)が MediatR によって内部的に実行されるまでには手遅れであり、現在の操作コンテキストは破棄または解放されていたと思います。

どんな洞察も大歓迎です!

于 2015-07-20T15:01:52.480 に答える