Ich verwende dies im Allgemeinen für einen Sitzungsschlüssel und fügen Sie dann explizit Objekte bei Bedarf hinzu. Der Grund dafür ist, dass es eine saubere Methode ist, und ich finde, dass Sie die Anzahl der Objekte in der Sitzung auf ein Minimum beschränken möchten.
Dieser spezielle Ansatz verbindet Formularauthentifizierung und Benutzersitzung an einem Ort, so dass Sie Objekte hinzufügen und vergessen können. Das Argument könnte gemacht werden, dass es ein großer Verbose ist, aber es verhindert jede Verdoppelung und Sie sollten nicht zu viele Objekte in der Sitzung haben.
Die folgenden können in einer Core-Bibliothek oder wo auch immer Sie wollen.
/// <summary>
/// Provides a default pattern to access the current user in the session, identified
/// by forms authentication.
/// </summary>
public abstract class MySession<T> where T : class
{
public const string USERSESSIONKEY = "CurrentUser";
/// <summary>
/// Gets the object associated with the CurrentUser from the session.
/// </summary>
public T CurrentUser
{
get
{
if (HttpContext.Current.Request.IsAuthenticated)
{
if (HttpContext.Current.Session[USERSESSIONKEY] == null)
{
HttpContext.Current.Session[USERSESSIONKEY] = LoadCurrentUser(HttpContext.Current.User.Identity.Name);
}
return HttpContext.Current.Session[USERSESSIONKEY] as T;
}
else
{
return null;
}
}
}
public void LogOutCurrentUser()
{
HttpContext.Current.Session[USERSESSIONKEY] = null;
FormsAuthentication.SignOut();
}
/// <summary>
/// Implement this method to load the user object identified by username.
/// </summary>
/// <param name="username">The username of the object to retrieve.</param>
/// <returns>The user object associated with the username 'username'.</returns>
protected abstract T LoadCurrentUser(string username);
}
}
Dann implementieren diese in der folgenden Klasse an die Wurzel des Projekts Namensraum (Ich habe es in der Regel in einem Code-Ordner auf mvc Projekte):
public class CurrentSession : MySession<PublicUser>
{
public static CurrentSession Instance = new CurrentSession();
protected override PublicUser LoadCurrentUser(string username)
{
// This would be a data logic call to load a user's detail from the database
return new PublicUser(username);
}
// Put additional session objects here
public const string SESSIONOBJECT1 = "CurrentObject1";
public const string SESSIONOBJECT2 = "CurrentObject2";
public Object1 CurrentObject1
{
get
{
if (Session[SESSIONOBJECT1] == null)
Session[SESSIONOBJECT1] = new Object1();
return Session[SESSIONOBJECT1] as Object1;
}
set
{
Session[SESSIONOBJECT1] = value;
}
}
public Object2 CurrentObject2
{
get
{
if (Session[SESSIONOBJECT2] == null)
Session[SESSIONOBJECT2] = new Object2();
return Session[SESSIONOBJECT2] as Object2;
}
set
{
Session[SESSIONOBJECT2] = value;
}
}
}
ENDLICH Der große Vorteil der ausdrücklich erklärt Was Sie in der Sitzung wollen, ist, dass Sie dies absolut überall in Ihrer MVC-Anwendung einschließlich der Ansichten verweisen können. Referenz Sie es einfach mit:
CurrentSession.Instance.Object1
CurrentSession.Instance.CurrentUser
Wieder etwas weniger generisch als andere Ansätze, aber wirklich, wirklich klar, was los ist, keine andere Ausrüstung oder Dependency Injection und 100% sicher auf den Anforderungskontext.
Eine andere Anmerkung, die dicionary Ansätze sind cool, aber Sie immer noch mit Strings überall auf Referenz Zeug. Sie könnten es mit Enums oder etwas riggen, aber ich bevorzuge das starke Tippen und Setzen und Vergessen des obigen Ansatzes.
Was passiert, wenn Sie den gleichen Typ an mehr als einen Controller übergeben? Eine Sitzung überschreibt die andere? –
Nein, sie haben beide den gleichen Typnamen und somit den gleichen Sitzungsschlüssel. Die Sitzungsobjekte werden nicht ersetzt, sie sind nur das gleiche Objekt auf beiden Controllern. –
Die unten hinzugefügte Antwort, die keine Basis-Controller erfordert und auch auf die Sitzung im Ansichtscode zugreifen kann. – Gats