2011-01-14 7 views
5

Quindi sto cercando di introdurre il concetto di utente nella mia applicazione e ho ottenuto il mio set di routine di login personalizzate, ecc. Nel mio modulo, sto vincolando la mia IUserSession alla mia implementazione e InSingletonScope.Ninject per sessione singleton?

Ora ho il sospetto che sia stato così e sono stato in grado di dimostrare che questa non è la cosa giusta da fare, se provo ad accedere con due utenti contro lo stesso sito, ottengo solo un set di dati.

Se si implementa un MembershipProvider, evitare tale restrizione. So che se implemento un provider di appartenenze, non devo iniettare tutto, ma il mio login non è solo un nome utente/password, come fare per accedere con dati aggiuntivi? "

risposta

11

InSingletonScope è condiviso da l'intera applicazione non limitato per ogni sessione utente Niente è fare la volontà cambiare la situazione, è necessario utilizzare qualcos'altro come InRequestScope ma che è condivisa solo per richiesta effettiva ...

Prova questo sito:.. 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

Is c'è un metodo più adatto alle sessioni utente in MVC? Questo risponde perfettamente alle mie esigenze per far funzionare il software, ma per riferimento futuro, fai k ora di alcuni esempi di fornitori di appartenenza personalizzati? – Hammerstein

+0

In cima alla mia testa non riesco a pensare ad alcun modo in cui un provider di appartenenza personalizzato possa aggirare il fatto che è ancora necessario memorizzare le informazioni in una sessione. Il tuo provider di appartenenza farebbe l'iniezione - se ti capisco correttamente. – Buildstarted

+1

Questo codice ti darà problemi se HttpContext.Current è nullo o se HttpContext.Current.Session è nullo (come all'interno di un HttpModule). – cbp