Accueil > .Net, ASP.Net, C# > [C#4] Gestion du Context et les strings…

[C#4] Gestion du Context et les strings…

Une des choses que je n’aime vraiment pas quand je code, c’est avoir des choses comme ceci :

Session["CurrentUser"]

Je n’aime vraiment pas pour deux raisons :

1.       C’est très sensible aux fautes de frappe et une faute de frappe, c’est très vite arrivé et dans ce cas, on perd très vite du temps pour des conneries

2.       Quand on veut changer le nom de la variable, ça prend beaucoup de temps (et quand on fait une recherche, on peut en oublier à cause de 1.)

Du coup, j’ai regardé un peu ce qui se fait sur le net pour voir si je ne pouvais pas avoir mieux.

Il y a beaucoup de solutions envisagées, mais j’avoue que la majorité ne me convenait pas trop.

Donc, j’ai tenté de résoudre ce problème en mixant un peu tout ce qui m’avait plu.

Ainsi, je me retrouve avec une classe « ContextHelper » qui gère (peut gérer) la session, le cache, les App.Settings et les ConnectionStrings.

L’idée est la suivante : j’ai une enum par type de composant à gérer (session/cache…) qui se trouve dans cette classe (dans la classe directement, on y accède via ContextHelper.SessionKeys, par exemple).

Chaque valeur de l’enum correspond à la clef de l’objet (dans le cache, la session, dans les App.Settings…).

Pour chaque composant, j’ai 2 ou 3 méthodes : Get / Set [/ Remove].

Bien sûr, comme dans la session comme pour le cache, on peut mettre des objets personnalisés, les méthodes se doivent donc d’être génériques.

J’ai donc les méthodes suivantes :

#region Gestion de la session
/// <summary>
/// Permet de récupérer la variable de session
/// </summary>
/// <typeparam name="T">Type de la variable de retour</typeparam>
/// <param name="key">Clef de la variable, dans la session</param>
/// <returns>Variable de la session ou son constructeur par défaut</returns>
public static T GetSessionValue<T>(SessionKeys key)
{
    try
    {
        var value = (T)HttpContext.Current.Session[key.ToString()];
        if (value == null)
            value = default(T);
        return value;
    }
    catch (NullReferenceException)
    {
        return default(T);
    }
}
/// <summary>
/// Permet de récupérer la variable de session
/// </summary>
/// <typeparam name="T">Type de la variable de retour</typeparam>
/// <param name="key">Clef de la variable, dans la session</param>
/// <param name="defaultValue">Valeur par défaut</param>
/// <returns>Variable de la session ou defaultValue</returns>
public static T GetSessionValue<T>(SessionKeys key, T defaultValue)
{
    try
    {
        var value = (T)HttpContext.Current.Session[key.ToString()];
        if (value == null)
            value = defaultValue;
        return value;
    }
    catch (NullReferenceException)
    {
        return defaultValue;
    }
}
/// <summary>
/// Permet de placer une variable en session
/// </summary>
/// <typeparam name="T">Type de la variable</typeparam>
/// <param name="key">Clef de la variable, dans la session</param>
/// <param name="value">Variable à mettre en session</param>
public static void SetSessionValue<T>(SessionKeys key, T value)
{
    HttpContext.Current.Session[key.ToString()] = value;
}
/// <summary>
/// Permet de retirer une variable de la session, si elle y est présente
/// </summary>
/// <param name="key">Clef de la variable, dans la session</param>
public static void RemoveSessionItem(CacheKeys key)
{
    try
    {
        var item = HttpContext.Current.Session[key.ToString()];
        if (item != null)
            HttpContext.Current.Session.Remove(key.ToString());
    }
    catch (NullReferenceException) { }
}
/// <summary>
/// Permet de vider la session
/// </summary>
public static void ClearSession()
{
    HttpContext.Current.Session.Clear();
}
/// <summary>
/// Permet de récupérer l'ID de la session
/// </summary>
/// <returns></returns>
public static string GetSessionId()
{
    return HttpContext.Current.Session.SessionID;
}
#endregion

#region Gestion du cache
/// <summary>
/// Permet de placer une variable dans le cache (expire dans 1 an)
/// </summary>
/// <typeparam name="T">Type de la variable de retour</typeparam>
/// <param name="key">Clef de la variable, dans le cache</param>
/// <param name="value">Variable à placer dans le cache</param>
public static void SetCacheValue<T>(CacheKeys key, T value)
{
    RemoveCacheItem(key);
    HttpRuntime.Cache.Insert(key.ToString(), value, null,
        DateTime.UtcNow.AddYears(1),
        System.Web.Caching.Cache.NoSlidingExpiration);
}
/// <summary>
/// Permet de placer une variable dans le cache
/// </summary>
/// <typeparam name="T">Type de la variable de retour</typeparam>
/// <param name="key">Clef de la variable, dans le cache</param>
/// <param name="value">Variable à placer dans le cache</param>
/// <param name="expiration">Date d'expiration de la variable</param>
public static void SetCacheValue<T>(CacheKeys key, T value, DateTime expiration)
{
    HttpRuntime.Cache.Insert(key.ToString(), value, null,
        expiration,
        System.Web.Caching.Cache.NoSlidingExpiration);
}
/// <summary>
/// Permet de placer une variable dans le cache
/// </summary>
/// <typeparam name="T">Type de la variable de retour</typeparam>
/// <param name="key">Clef de la variable, dans le cache</param>
/// <param name="value">Variable à placer dans le cache</param>
/// <param name="slidingExpiration">Expiration après la dernière utilisation</param>
public static void SetCacheValue<T>(CacheKeys key, T value, TimeSpan slidingExpiration)
{
    HttpRuntime.Cache.Insert(key.ToString(), value, null,
        System.Web.Caching.Cache.NoAbsoluteExpiration,
        slidingExpiration);
}

/// <summary>
/// Permet de récupérer une variable dans le cache
/// </summary>
/// <typeparam name="T">Type de la variable de retour</typeparam>
/// <param name="key">Clef de la variable, dans le cache</param>
/// <returns>Variable du cache</returns>
public static T GetCacheValue<T>(CacheKeys key)
{
    try
    {
        T value = (T)HttpRuntime.Cache.Get(key.ToString());
        if (value == null)
            return default(T);
        else
            return value;
    }
    catch (NullReferenceException)
    {
        return default(T);
    }
}
/// <summary>
/// Permet de retirer une variable du cache, si elle y est présente
/// </summary>
/// <param name="key">Clef de la variable, dans le cache</param>
public static void RemoveCacheItem(CacheKeys key)
{
    try
    {
        var item = HttpRuntime.Cache[key.ToString()];
        if (item != null)
            HttpRuntime.Cache.Remove(key.ToString());
    }
    catch (NullReferenceException) { }
}
#endregion

#region Gestion des App.Settings
/// <summary>
/// Permet de récupérer une variable dans le Web.config / App.Settings
/// </summary>
/// <param name="key">Clef de la variable</param>
/// <returns>Variable</returns>
public static string GetConfiguration(AppSettingsKeys key)
{
    try
    {
        return ConfigurationManager.AppSettings[key.ToString()];
    }
    catch (NullReferenceException)
    {
        return string.Empty;
    }
}
#endregion

Donc, lorsque je veux récupérer mon utilisateur dans la session :

ContextHelper.GetSessionValue<UserModel>(ContextHelper.SessionKeys.SessionCurrentUser)

La ligne est certes plus longue, mais il n’empêche que si je fais un coup de refactoring, ça sera uniquement sur l’enum…

Dans le cas où j’ai besoin de l’utiliser directement dans une page, il suffit d’ajouter dans le Web.config (pour peut que cette classe soit dans le namespace idoine) :

    <pages>
      <namespaces>
        <add namespace="MyProject.WebApp.Helper" />
      </namespaces>
    </pages>
Catégories :.Net, ASP.Net, C#
  1. 28/06/2012 à 10:25

    Une façon de faire beaucoup plus propre en effet, merci !
    Je l’ai implémenté dans un projet ASP.Net personnel et ca marche du feu de Dieu😀

  1. No trackbacks yet.

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

%d blogueurs aiment cette page :