2009-06-28 7 views
10

私はNInjectバインディングをかなり新しくしています。ここにはNInjectの説明があります。タイプのNInjectでMembershipProviderをバインドするときにInSingletonScopeを使用する必要がありますか?

  • TransientBehavior -A新しいインスタンスは、1つが要求されるたびに作成されます。
  • SingletonBehavior - 型の単一のインスタンスが作成され、以降の要求ごとに同じインスタンスが返されます。
  • OnePerThreadBehavior - 1つのタイプのインスタンスがスレッドごとに作成されます。
  • OnePerRequestBehavior - 1つのタイプのインスタンスがWeb要求ごとに作成され、要求が終了すると破棄されます。

私はSqlMembershipProviderへのMembershipProviderをバインドしたい場合は、私が唯一の1つのSQLメンバシッププロバイダを必要とするので、私はSingletonBehaviorを使用する必要がありますか?

+0

も参照してください:http://stackoverflow.com/questions/2753424 –

答えて

13

ASP.Netが既に静的会員クラスとその静的プロバイダープロパティを介して電流メンバーシッププロバイダーの静的インスタンスを提供します。結合は、おそらくあなたのApplication_Startメソッド内にあり、このようなものになります。もう一度

Bind<MembershipProvider>() 
    .ToMethod(ctx => Membership.Provider); 

を、Memberhip.Providerが静的​​であるので、それはすでに一種のシングルトンのようなものですので、あなたがしようと行動を適用しますそれほど重要ではありません。

上記のスニペットで動作を指定しないと、Ninjectはデフォルトで一時的な動作になります。この種のバインディングでは、返すラムダを呼び出すことになると信じていますメンバーシップMembershipProviderタイプを挿入する必要があるたびに。

私は明示的にNinjectはおそらく効果で「キャッシュ」ラムダそれはのMembershipProviderを注入する必要がある最初の時間によって返される値は、実行のオーバーヘッドを節約と同じようにシングルトンの動作を指定するための引数があるかもしれないと仮定しますラムダ。私はこの状況でNinjectがどのように動作するかは100%確信していませんが、それは妥当と思われます。

私の個人的な好みは、OnePerRequestBehaviorを使用することです。この方法で、Ninjectは各リクエストごとに1回ラムダを呼び出すことがわかります。確かに必要ではありませんが、私はプロバイダをから取得するというアイデアが気に入っていますMembership.Providerあなたはおそらく見つけ出すことができますが、は、リフレクターで十分に掘り下げれば。

Bind<MembershipProvider>() 
    .ToMethod(ctx => Membership.Provider) 
    .Using<OnePerRequestBehavior>(); 

幸運。申し訳ありませんあなたの質問はここに長い間座っていた!

+0

ありがとう、私はちょうどユーザーがログオフし、他の誰かがログオンすると、Ninjectは前のユーザーを保持しないでください。あなたは確認できますか? – Haroon

関連する問題