2008-12-03 13 views
0

Je crée une application Web qui utilise une classe construite de manière externe pour gérer une grande partie du travail et des règles du site. La plupart des pages nécessiteront l'accès à cette classe pour obtenir les informations dont elles ont besoin. Dans le passé, je mettais une telle classe dans une variable de session, de sorte qu'elle est facilement accessible lorsque cela est nécessaire et n'a pas besoin d'être continuellement ré-instanciée.Meilleure pratique pour gérer les classes de site

Première question, est-ce une mauvaise idée de mettre cette classe dans une variable de session (ce n'est pas très grand)? Deuxième question, si ce n'est pas une mauvaise idée de stocker la classe de couche application sites dans une session, puis-je écrire une méthode centralisée à utiliser pour saisir ou stocker la classe dans la session? Je ne veux pas utiliser un tas de code répété page après page obtenant la classe, vérifiant son là, créant si ce n'est pas, etc

Répondre

0

Sans savoir que les cadres que vous utilisez, il ne semble pas une bonne idée de mettre un classe dans le magasin de session - il sera copié une fois par utilisateur - sauf s'il a des données qui sont uniques à cet utilisateur. Le meilleur conseil que je peux donner serait d'avoir une classe singleton (vous pouvez google it - c'est un motif de design) et ensuite avoir une fonction dans cette classe qui retournera la classe dont vous avez besoin, ou la créer si ça n'existe pas encore.

3

Avant de décider où stocker votre classe, vous devez répondre à deux questions:

  1. Depuis combien de temps cette classe devrait vivre?
  2. Dans quel champ devrait-il être visible? Exemples répondant aux deux questions: demande, session utilisateur, application.

Si cette classe est sans état (aucune donnée et uniquement logique), alors elle peut probablement vivre pendant la durée entière de l'application . S'il s'agit de données uniques à chaque utilisateur (qui ne doivent pas être rechargées à chaque requête), vous pouvez les mettre directement en session et ignorer les paragraphes suivants. Maintenant, après avoir décidé de la durée de vie, vous avez plusieurs solutions. La meilleure solution pour la gestion du style de vie est un conteneur IoC. La solution la plus simple consiste simplement à faire abstraction du stockage et à utiliser une façade statique, telle que Current.MyClass, où l'instance MyClass est stockée dans la requête, la session ou l'application en fonction du stockage fourni à Current. Cependant, vous ne devez pas implémenter singleton dans la classe spécifiée, car il ne devrait pas décider lui-même du nombre d'instances dont vous avez besoin et il limite votre capacité à remplacer est avec une autre classe avec la même interface si nécessaire.

0

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 ""; 
     } 
    } 
}