3

同じプロジェクトに WCF サービスも含まれている ASP.NET MVC のアプリケーションがあります。

Autofac を使用して依存性注入を管理しています。問題は、Web 経由でアプリケーションにアクセスする場合、Http 要求ごとに依存関係をインスタンス化する必要があることです。また、WCF を介してアプリケーションにアクセスするときは、依存関係を依存関係ごとにインスタンス化する必要があります。

Castle.Windsor では、ハイブリッド ライフスタイルを管理するプロジェクトがあります (このリンク内)。

私は似たようなものが必要です:

builder.Register<UnitOfMeasureService>(x => new UnitOfMeasureService())
            .As<IUnitOfMeasureService>().HybridLifetimeInstance();

アプリケーションにある場合とない場合に応じて、インスタンスの有効期間を管理する回避策はありますHttpContextか?

4

1 に答える 1

5

Autofac は、カスタム ライフスタイル マネージャーをサポートしていません。

Autofac の有効期間は、ネスト可能で、オプションで既知の ID でタグ付けできるスコープを中心に展開します。HTTP リクエストごとのインスタンスは次のように機能します。Web リクエストが着信すると、既知の値 (「AutofacWebRequest」) で「タグ付けされた」ネストされたスコープが作成されます。階層は次のようになります。

  • コンテナー (ルート ライフタイム スコープ)
    • Web リクエスト スコープ (タグ「AutofacWebRequest」)
      • コードで作成する可能性のある子スコープ

使い方InstancePerHttpRequestは基本的に と同じInstancePerMatchingLifetimeScope("AutofacWebRequest")です。タイプを解決すると、その名前のスコープが見つかるまでフォールバックし、そのタグ付きスコープで同じインスタンスを使用します。

標準の WCF ホスティングでは、Autofac は、インスタンス コンテキスト ( ) から取得できる子スコープからすべてを解決しますAutofacInstanceContext.Current.OperationLifetime。そこから子の有効期間スコープを作成し、手動でタグ付けしてから、依存関係を次のように解決できます。

var opScope = AutofacInstanceContext.Current.OperationLifetime;
using(var requestScope = opScope.BeginLifetimeScope("AutofacWebRequest"))
{
  // Resolve InstancePerHttpRequest items from requestScope
}

ただし、それを自動的に行う方法はなく、WCF ホスティング メカニズムは現在、「プラグイン」してこれを実行できるように設計されていません。Web 要求スコープを自動的に作成する必要がある場合は、独自のスコープを作成する必要があります。 Autofac ソース コードに基づく WCF ホスティング メカニズム

もう1つのオプションは、Web 用と WCF 用の 2 つの異なるコンテナーを用意し、各コンテナーに異なる有効期間を持つコンポーネントを登録することです。

それを超えて... context に基づいてライフタイムを「切り替える」方法は本当にありません。コンポーネントは、宣言された 1 つの有効期間を取得し、そのコンポーネント レジストリに対して存続する必要があります。

于 2013-02-28T19:06:47.577 に答える