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 つの有効期間を取得し、そのコンポーネント レジストリに対して存続する必要があります。