2012-06-19 6 views
5

Mi sono da poco coinvolto in un progetto ASP.NET classico che contiene molti valori di memorizzazione e lettura dalla sessione e stringhe di query. Questo potrebbe essere simile al seguente:Seguendo il principio ASCIUGATURA in ASP.NET

Session["someKey"]=someValue; 

E da qualche altra parte nel codice viene letto il valore nella sessione. Chiaramente questo viola il principio DRY poiché avrai la chiave di stringa letterale sparsi per tutto il codice. Un modo per evitare ciò potrebbe essere quello di memorizzare tutte le chiavi come costanti a cui è possibile fare riferimento ovunque sia necessario leggere e scrivere sulla sessione. Ma non sono sicuro che sia il modo migliore per farlo. Come raccomanderesti di gestirlo al meglio in modo da non violare il principio di ASCIUTTO?

risposta

7

Creare una classe separata pubblico in cui è possibile definire le costanti, ad esempio

public class SessionVars 
{ 
    public const string SOME_KEY = "someKey"; 
    public const string SOME_OTHER_KEY = "someOtherKey"; 
} 

e quindi qualsiasi punto del codice è possibile accedere a variabili di sessione in questo modo:

Session[SessionVars.SOME_KEY]=someValue; 

In questo modo è possibile ottenere IntelliSence e altre campane e fischietti.

+0

1 Questo è il modello tendo a seguire - in realtà aiuta ad eliminare quegli insetti fastidiosi typo. –

+1

Non dovresti usare 'const' in questo contesto. 'static readonly' è più appropriato (e sicuro). – EkoostikMartin

+1

Come è questo alleviare il principio di non ripetere te stesso? Stai ancora scrivendo lo stesso 1 rivestimento in tutto il mondo, stai solo usando una variabile costante invece di una stringa di istanza per la chiave? – BlackSpy

2

Penso che stai leggendo troppo in ASCIUTTO. Io appartengo più a cose che potrebbero essere racchiuse in una funzione. Cioè invece di ripetere le stesse cinque righe in tutto il luogo, avvolgi quelle 5 linee in una funzione e chiama la funzione ovunque ti serva.

Quello che hai come esempio è semplicemente l'impostazione di un valore in un dizionario (l'oggetto sessione in questo caso), e questo è il modo più semplice per archiviare e recuperare oggetti in esso.

+1

Vorrei che tu non eredita un progetto pieno di magia * * stringhe vostra necessità di mantenere ... –

0

Opzionalmente è possibile inserire l'accesso a questo oggetto sessione in una pagina di base e avvolgerlo in una proprietà:

class BasePage : Page 
{ 
    ... 
    public string MySessionObject 
    { 
     get 
     { 
     if(Session["myKey"] == null) 
      return string.Empty; 
     return Session["myKey"].ToString(); 
     } 
     set 
     { 
      Session["myKey"] = value; 
     } 
    } 
    ... 
} 

Qui si sta ripetendo la stringa myKey ma è incapsulato nella proprietà. Se vuoi andare all'estremo di evitare ciò, crea una costante con la chiave e sostituisci la stringa.

1

non riesco a ricordare per la vita di me, dove io umilmente riutilizzati questo codice da, ma è abbastanza piacevole:

using System; 
using System.Web; 

namespace Project.Web.UI.Domain 
{ 
    public abstract class SessionBase<T> where T : class, new() 
    { 
     private static readonly Object _padlock = new Object(); 

     private static string Key 
     { 
      get { return typeof(SessionBase<T>).FullName; } 
     } 

     public static T Current 
     { 
      get 
      { 
       var instance = HttpContext.Current.Session[Key] as T; 

       lock (SessionBase<T>._padlock) 
       { 
        if (instance == null) 
        { 
         HttpContext.Current.Session[Key] 
          = instance 
          = new T(); 
        } 
       } 
       return instance; 
      } 
     } 

     public static void Clear() 
     { 
      var instance = HttpContext.Current.Session[Key] as T; 
      if (instance != null) 
      { 
       lock (SessionBase<T>._padlock) 
       { 
        HttpContext.Current.Session[Key] = null; 
       } 
      } 
     } 
    } 
} 

L'idea alla base di due volte. Il tipo creato dovrebbe essere l'unico tipo di cui hai bisogno. È fondamentalmente un grande involucro fortemente tipizzato. In modo da avere qualche oggetto che si desidera conservare estendere le informazioni in:

public class MyClass 
{ 
    public MyClass() 

    public string Blah1 { get; set; } 
} 

Poi lungo la strada si estende MyClass e non si desidera avere a ricordare tutti i valori chiave, memorizzarli in AppSettings o variabili Const in Classi statiche. È sufficiente definire ciò che si desidera memorizzare:

public class MyClassSession : SessionBase<MyClass> 
{ 
} 

E in qualsiasi punto del programma si utilizza semplicemente la classe.

// Any Asp.Net method (webforms or mvc) 
public void SetValueMethod() 
{ 
    MyClassSesssion.Current.Blah1 = "asdf"; 
} 

public string GetValueMethod() 
{ 
    return MyClassSession.Current.Blah1; 
}