2011-01-14 19 views
5

Así que estoy tratando de introducir el concepto de usuario en mi aplicación y tengo mi propio conjunto de rutinas de inicio de sesión personalizadas, etc. que funcionan bien. En mi módulo, estoy vinculando mi IUserSession a mi implementación y a InSingletonScope.Ninject por sesión singleton?

Ahora sospecho que este fue el caso y he podido demostrar que esto no es lo correcto, si intento iniciar sesión con dos usuarios contra el mismo sitio, obtengo solo un conjunto de datos.

Si implemento un MembershipProvider, evito dicha restricción. Sé que si implemento un proveedor de membresía, no tengo que inyectar todo, pero mi inicio de sesión no es solo un nombre de usuario/contraseña, ¿cómo iniciar sesión con datos adicionales? "

Respuesta

11

InSingletonScope se comparte en todo toda la aplicación no se limita por sesión de usuario Nada de lo que no va a cambiar eso Es necesario utilizar algo más como InRequestScope pero que sólo es compartida por solicitud real ...

Prueba este sitio:.. 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

Es Hay un método más adecuado para las sesiones de usuario en MVC? Esto se ajusta perfectamente a mi necesidad para que el software funcione, pero para referencia futura, ¿tiene usted alguna duda? ahora de algún ejemplo de proveedores de membresía personalizados? – Hammerstein

+0

No tengo idea de qué manera un proveedor de membresía personalizado evitará el hecho de que todavía necesita almacenar su información en una sesión. Su proveedor de membresía estaría haciendo la inyección, si lo entiendo correctamente. – Buildstarted

+1

Este código le dará problemas si HttpContext.Current es nulo, o si HttpContext.Current.Session es nulo (como dentro de un HttpModule). – cbp

Cuestiones relacionadas