は、あなたのウェブサイトの同時ユーザーの間で共有されるカーネルですか?
典型的な(および推奨される)セットアップでは、AppDomainごとにKernel
のインスタンスが1つあります。これは、すべての要求(したがってすべてのユーザー)が同じKernel
インスタンスにアクセスすることを意味します(場合によっては並行して)。
オブジェクトグラフの構築をベースに推奨されていません
...別のユーザーが、このように同じインタフェース何かの異なる具体的な実装を取得するように、条件付きバインディングを作成することが可能ですランタイムデータ(user == "A"
はランタイムデータuser
に基づく決定)に基づいています。 injecting runtime data into application composentsがないように、これは同じ欠点を公開します。それは、あいまいさの原因となる余分な責任を有する組成物のルートを複雑にし、それは非常に難しいあなたのDIの設定が正しいかどうかを検証することができ
。
代わりに、アドバイスである:構築されたオブジェクトグラフのメソッド呼び出しを介して実行時のデータの流れをできるように
。
あなたは、単にとエレガントなランタイムデータに基づいてFooForA
またはFooForB
のいずれかへの着信呼を、転送IFoo
のプロキシを導入することによって、これを達成することができます。例えば:
public sealed class FooSelectorProxy : IFoo
{
private readonly FooForA afoo;
private readonly FooForB bfoo;
public FooSelectorProxy(FooForA afoo, FooForB bfoo) {
this.afoo = afoo;
this.bfoo = bfoo;
}
public object FooMethod(object args) {
return CurrentFoo.FooMethod(args);
}
private IFoo CurrentFoo {
get { return user == "A" ? this.afoo : this.bfoo; }
}
}
このFooSelectorProxy
を使用すると、次登録することができます:これは瞬間まで後にオブジェクトグラフの構築をまでif (user == "A")
コードの実行を延期
kernel.Bind<IFoo>().To<FooSelectorProxy>();
をそのランタイムデータが利用可能です。
優れた答え。あなたの助けをありがとう。 –