10

私はNInjectバインディングにかなり慣れていません。これが、NInjectの説明です。

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

MembershipProviderをSqlMembershipProviderにバインドする場合、必要なSQLメンバーシッププロバイダーは1つだけなので、SingletonBehaviorを使用する必要がありますか?

4

1 に答える 1

13

ASP.Net は、静的メンバーシップクラスとその静的Providerプロパティを介して、現在のメンバーシップ プロバイダーの静的インスタンスを既に提供しています。バインディングはおそらく Application_Start メソッドにあり、次のようになります。

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

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

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

Ninject は、初めてMembershipProviderを注入する必要があるときにラムダによって返された値を「キャッシュ」する可能性が高いため、シングルトンの動作を明示的に指定するための引数があると思います。これにより、ラムダを実行するオーバーヘッドが節約されます。この状況で Ninject がそのように機能するかどうかは 100% 確信が持てませんが、そうするのが妥当だと思われます。

とは言っても、私の個人的な好みはOnePerRequestBehaviorを使用することです。これにより、Ninject が要求ごとに 1 回ラムダを呼び出すことがわかります。必要かどうかはわかりませんが、 Membership.Providerがどのように、またはいつ設定されるかについて推測できないと思うので、リクエストごとに一度、 Membership.Providerからプロバイダーを取得するというアイデアが気に入っています。リフレクター付き。

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

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

于 2009-08-11T13:42:21.240 に答える