Le jury est encore sur si la classe devrait être stockée dans la session en premier lieu. Avec l'application pour laquelle j'ai posé la question, j'ai choisi de ne pas bourrer la classe en session, ce n'était vraiment pas nécessaire, j'étais paresseux. Travailler sur cette méthode pour gérer la session valait tout le temps, car c'est quelque chose qui m'a dérangé pendant un certain temps dans le développement web.
Ce qui est sorti de mes recherches est l'écriture d'une classe statique pour gérer mes variables de session. Cette classe gère toutes les lectures et les écritures de la session et les garde toutes fortement typées pour que je puisse les démarrer. Il m'a toujours dérangé en utilisant le code répété partout pour la merde session. Garde les fautes de frappe aussi.
Il y a deux articles que j'aime, que je trouve à ce sujet, je ne peux en trouver que l'un maintenant et j'inclurai l'autre quand je le trouverai.
La première était à Code Project Cela peut être le deuxième link
Le modèle est facile et simple. J'ai également construit une classe pour les demandes de saisie de paramètres à partir des chaînes de requête url. Je ne vois aucune raison de ne pas l'étendre aux cookies aussi.
C'était ma première utilisation du modèle, j'ai seulement utilisé des chaînes de sorte que la méthode privée est un peu limitée, mais cela peut facilement être changé pour utiliser n'importe quelle classe ou type primitif.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Configuration;
namespace BDZipper.Site
{
/// <summary>
/// This class maintains all session variables for us instead of handeling them
/// individually in the session. They are also strongly typed.
/// </summary>
public static class SessionManager
{
# region Private Constants
// Define string constant for each property. We use the constant to call the session variable
// easier not to make mistakes this way.
// I think for simplicity, we will use the same key string in the web.config AppSettings as
// we do for the session variable. This way we can use the same constant for both!
private const string startDirectory = "StartDirectory";
private const string currentDirectory = "CurrentDirectory";
# endregion
/// <summary>
/// The starting directory for the application
/// </summary>
public static string StartDirectory
{
get
{
return GetSessionValue(startDirectory, true);
}
//set
//{
// HttpContext.Current.Session[startDirectory] = value;
//}
}
public static string CurrentDirectory
{
get
{
return GetSessionValue(currentDirectory, false);
}
set
{
HttpContext.Current.Session[currentDirectory] = value;
}
}
//TODO: Update to use any class or type
/// <summary>
/// Handles routine of getting values out of session and or AppSettings
/// </summary>
/// <param name="SessionVar"></param>
/// <param name="IsAppSetting"></param>
/// <returns></returns>
private static string GetSessionValue(string SessionVar, bool IsAppSetting)
{
if (null != HttpContext.Current.Session[SessionVar])
return (string)HttpContext.Current.Session[SessionVar];
else if (IsAppSetting) // Session null with appSetting value
return ConfigurationManager.AppSettings[SessionVar];
else
return "";
}
}
}