2012-06-19 3 views
5

Ich habe vor kurzem in einem klassischen ASP.NET-Projekt beteiligt, die viele speichern und Lesen von Werten aus der Sitzung und Abfrage-Strings enthält. Dies könnte in etwa wie folgt aussehen:Nach dem DRY-Prinzip in ASP.NET

Session["someKey"]=someValue; 

Und woanders im Code wird der Wert in der Sitzung gelesen. Dies verstößt eindeutig gegen das DRY-Prinzip, da Sie den literalen String-Schlüssel über den gesamten Code verteilt haben. Eine Möglichkeit, dies zu vermeiden, könnte darin bestehen, alle Schlüssel als Konstanten zu speichern, die überall dort referenziert werden können, wo die Sitzung gelesen und geschrieben werden muss. Aber ich bin mir nicht sicher, ob das der beste Weg ist. Wie würdest du empfehlen, dass ich das am besten behandle, damit ich nicht gegen das DRY-Prinzip verstoße?

Antwort

7

Erstellen Sie eine separate öffentliche Klasse, wo Sie Ihre Konstanten definieren, zB

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

und überall in Ihrem Code dann können Sie Session-Variablen wie folgt zugreifen:

Session[SessionVars.SOME_KEY]=someValue; 

So kann man bekommen kann IntelliSence und andere Schnickschnack.

+0

+1 Dies ist das Muster, das ich zu folgen neigen - es hilft wirklich die lästigen Tippfehler Fehler zu beseitigen. –

+1

Sie sollten in diesem Zusammenhang nicht 'const' verwenden. 'static readonly' ist besser geeignet (und sicher). – EkoostikMartin

+1

Wie lindert das das Prinzip, sich nicht zu wiederholen? Sie schreiben immer noch den gleichen 1-Liner überall, Sie verwenden nur eine konstante Variable anstelle einer Instanz-Zeichenkette für den Schlüssel? – BlackSpy

2

Ich denke, Sie lesen zu viel in DRY. Ich betrachte mehr Dinge, die in einer Funktion verpackt werden könnten. I.e. anstatt die gleichen fünf Zeilen überall zu wiederholen, wickeln Sie diese 5 Zeilen in eine Funktion und rufen Sie die Funktion überall dort auf, wo Sie sie brauchen.

Was Sie als Beispiel haben, ist nur einen Wert in einem Wörterbuch (das Sitzungsobjekt in diesem Fall), und das ist die einfachste Möglichkeit, Objekte darin zu speichern und abzurufen.

+1

Ich wünsche Ihnen nie ein Projekt voller erben * Magie * reiht Ihre Notwendigkeit zu halten ... –

0

Optional können Sie den Zugriff auf diese Session-Objekt in einer Basis Seite platzieren und wickeln Sie es in einer Eigenschaft:

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

Hier haben Sie die myKey Zeichenfolge wiederholen, aber es wird in die Eigenschaft gekapselt. Wenn Sie das Extreme vermeiden möchten, erstellen Sie eine Konstante mit dem Schlüssel und ersetzen Sie die Zeichenfolge.

1

Ich kann nicht für das Leben von mir erinnern, wo ich demütig wiederverwendet diesen Code aus, aber es ist sehr schön:

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

Die Idee dahinter zweifach. Der erstellte Typ sollte der einzige Typ sein, den Sie benötigen. Es ist im Grunde ein großer, stark typisierter Wrapper. So haben Sie einige Objekt möchten Sie bei der Ausweitung Informationen halten:

public class MyClass 
{ 
    public MyClass() 

    public string Blah1 { get; set; } 
} 

Dann die Straße hinunter erstrecken Sie MyClass und Sie wollen nicht alle Schlüsselwerte zu haben, sich daran zu erinnern, speichern sie in AppSettings oder Konst Variablen in Statische Klassen. Sie definieren einfach, was Sie speichern möchten:

public class MyClassSession : SessionBase<MyClass> 
{ 
} 

Und überall in Ihrem Programm verwenden Sie einfach die Klasse.

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

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