2011-01-14 14 views
5

Tak więc próbuję wprowadzić pojęcie użytkownika do mojej aplikacji i mam własny zestaw niestandardowych procedur logowania itp. Działa dobrze. W moim module wiążę moją IUserSession z moją implementacją i InSingletonScope.Jednoosobowa sesja na singleton?

Podejrzewam, że tak było i udało się udowodnić, że nie jest to właściwe, jeśli spróbuję zalogować się z dwoma użytkownikami przeciwko tej samej witrynie, otrzymam tylko jeden zestaw danych.

Jeśli wdrożę usługę MembershipProvider, należy unikać takiego ograniczenia. Wiem, że jeśli zaimplementowałem dostawcę członkostwa, nie muszę wstrzykiwać wszystkiego, ale mój login to nie tylko nazwa użytkownika/hasło, w jaki sposób logować się z dodatkowymi danymi "?

Odpowiedz

11

InSingletonScope jest udostępniany cała aplikacja nie tylko na sesję użytkownika Nic nie zrobisz zmieni, że trzeba użyć czegoś innego jak InRequestScope ale to tylko za rzeczywistą wspólną prośbę ...

Spróbuj witrynie:.. 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

czy istnieje lepsza metoda dla sesji użytkownika w MVC? To idealnie pasuje do mojej potrzeby, aby oprogramowanie działało, ale na przyszłość, k teraz o jakichkolwiek przykładach spersonalizowanych dostawców członkostwa? – Hammerstein

+0

Nie mam pojęcia, w jaki sposób spersonalizowany dostawca członkostwa poradzi sobie z faktem, że nadal musisz przechowywać informacje w sesji. Twój dostawca członkostwa wykona zastrzyk - jeśli dobrze cię zrozumiem. – Buildstarted

+1

Ten kod spowoduje problemy, jeśli HttpContext.Current ma wartość NULL lub jeśli HttpContext.Current.Session ma wartość NULL (na przykład wewnątrz modułu HttpModule). – cbp