2016-12-28 5 views
1

ASP.NET MVCアプリケーションでNinjectを使用する場合、カーネルはWebサイト上の同時ユーザーの間で共有されていますか? ASP.NET MVCとウェブ全体での目標

if (user == "A") 
     kernel.Bind<IFoo>().To<FooForA>(); 
else 
     kernel.Bind<IFoo>().To<FooForB>(); 

は、競合が発生することなく、

...別のユーザーが、このように同じインタフェース何かの異なる具体的な実装を取得するように、条件付きバインディングを作成することが可能ですか?

答えて

2

は、あなたのウェブサイトの同時ユーザーの間で共有されるカーネルですか?

典型的な(および推奨される)セットアップでは、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>(); 

をそのランタイムデータが利用可能です。

+0

優れた答え。あなたの助けをありがとう。 –

関連する問題