Simple Injector で Execution Context Scope または Lifetime Scope のいずれかに登録された依存関係にデータを渡す方法はありますか?
私の依存関係の 1 つは、依存関係チェーンで構築するためにデータの一部を必要とします。HTTP および WCF 要求の間、このデータは簡単に取得できます。HTTP 要求の場合、データは常にクエリ文字列またはRequest.Form
パラメータとして存在します (したがって、から利用できますHttpContext.Current
)。WCF 要求の場合、データは常にOperationContext.Current.RequestContext.RequestMessage
XML に存在し、解析できます。このデータを必要とするインターフェイスの実装に依存する多くのコマンド ハンドラーの実装があり、それらは HTTP および WCF スコープのライフスタイルでうまく機能します。
ここで、Task Parallel Library を使用してこれらのコマンドの 1 つ以上を実行できるようにして、別のスレッドで実行できるようにしたいと考えています。データの一部を構成ファイル、クラス、またはその他の静的アーティファクトに移動することは現実的ではありません。最初に、HTTP または WCF を介してアプリケーションに渡す必要があります。
Task
Simple Injector を使用してハイブリッド ライフスタイルを作成する方法を知っており、既にハイブリッド HTTP / WCF / Execution Context Scope (コマンド インターフェイスは非同期であり、代わりに戻ります) としてセットアップされていますvoid
。また、必要に応じて新しい実行コンテキスト スコープを開始するコマンド ハンドラー デコレーターを作成する方法も知っています。問題は、依存関係チェーンが依存関係の1つを構築するために必要なときに利用できるように、このデータの一部を「保存」する方法または場所(またはできるかどうか)がわからないことです。
出来ますか?もしそうなら、どのように?
アップデート
現在、IProvideHostWebUri
2 つの実装で呼び出されるインターフェイスがあります:HttpHostWebUriProvider
とWcfHostWebUriProvider
. インターフェイスと登録は次のようになります。
public interface IProvideHostWebUri
{
Uri HostWebUri { get; }
}
container.Register<IProvideHostWebUri>(() =>
{
if (HttpContext.Current != null)
return container.GetInstance<HttpHostWebUriProvider>();
if (OperationContext.Current != null)
return container.GetInstance<WcfHostWebUriProvider>();
throw new NotSupportedException(
"The IProvideHostWebUri service is currently only supported for HTTP and WCF requests.");
}, scopedLifestyle); // scopedLifestyle is the hybrid mentioned previously
したがって、最終的には、このアプローチを根絶しない限り、私の目標は、このインターフェイスの 3 番目の実装を作成することです。これは、ある種のコンテキストに依存して Uri を取得します (これは、他の 2 つの実装の文字列から構築されたものです)。
@Stevenの答えは私が探しているもののようですが、ITenantContext
実装を不変でスレッドセーフにする方法がわかりません。値が含まれているだけなので、使い捨てにする必要はないと思いUri
ます。