2011-01-14 10 views
5

私は自分のアプリケーションにユーザーのコンセプトを導入しようとしており、独自のカスタムログインルーチンなどがうまく動作しています。私のモジュールでは、自分の実装とInSingletonScopeにIUserSessionをバインドします。Ninject per session singleton?

これは正しいケースであり、これが正しいことではないことを証明できました。同じサイトに対して2人のユーザーでログインしようとすると、データは1セットしか取得されません。

私がMembershipProviderを実装する場合、そのような制限は避けてください。メンバーシッププロバイダを実装すると、すべてを注入する必要はありませんが、ログインはユーザー名/パスワードだけではなく、追加データでログインするにはどうすればよいのでしょうか?」

答えて

11

InSingletonScopeは。ユーザー・セッションごとに限定されるものではなく、あなたが何もそれを変更しませんアプリケーション全体あなたはInRequestScopeのような何か他のものを使用する必要があるが、それが唯一の実際の要求ごとに共有されます...

このサイト試してみてください。http://iridescence.no/post/Session-Scoped-Bindings-With-Ninject-2.aspx

public static class NinjectSessionScopingExtention { 
    public static void InSessionScope<T>(this IBindingInSyntax<T> parent) { 
     parent.InScope(SessionScopeCallback); 
    } 

    private const string _sessionKey = "Ninject Session Scope Sync Root"; 

    private static object SessionScopeCallback(IContext context) { 
     if (HttpContext.Current.Session[_sessionKey] == null) { 
      HttpContext.Current.Session[_sessionKey] = new object(); 
     } 

     return HttpContext.Current.Session[_sessionKey]; 
    } 
} 
+0

はありますMVCのユーザーセッションに適したメソッドがありますか?これは私の必要性を完全に満たしてソフトウェアを稼働させますが、将来参照するためにkカスタマイズされたメンバーシッププロバイダの例は何ですか? – Hammerstein

+0

私の頭の上から離れて、カスタマイズされたメンバーシップ・プロバイダーがあなたの情報をセッションに保存する必要があるという事実を回避する方法は考えられません。私があなたを正しく理解していれば、あなたのメンバーシッププロバイダーが注射をしています。 – Buildstarted

+1

このコードは、HttpContext.Currentがnullの場合、またはHttpContext.Current.Sessionがnullの場合(HttpModuleの内部など)に問題が発生します。 – cbp