No puedo recordar para la vida de mí, donde humildemente re-utilizados este código a partir, pero es bastante agradable:
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;
}
}
}
}
}
La idea detrás de él dos veces. El tipo creado debe ser el único tipo que necesita. Básicamente es un envoltorio grande fuertemente tipado. Así que hay algún objeto que desea mantener la información que se extiende en:
public class MyClass
{
public MyClass()
public string Blah1 { get; set; }
}
A continuación, en el camino a ampliar MyClass
y no quieren tener que recordar todos los valores clave, almacenarlos en AppSettings o variables en Const Clases estáticas Simplemente defina lo que desea almacenar:
public class MyClassSession : SessionBase<MyClass>
{
}
Y en cualquier lugar de su programa, simplemente use la clase.
// Any Asp.Net method (webforms or mvc)
public void SetValueMethod()
{
MyClassSesssion.Current.Blah1 = "asdf";
}
public string GetValueMethod()
{
return MyClassSession.Current.Blah1;
}
1 Este es el patrón tiendo a seguir - lo que realmente ayuda a eliminar esos errores tipográficos molestos. –
No debe usar 'const' en este contexto. 'static readonly' es más apropiado (y seguro). – EkoostikMartin
¿Cómo es eso aliviando el principio de No repetir? ¿Todavía está escribiendo el mismo liner en todas partes, solo está usando una variable constante en lugar de una cadena de instancia para la clave? – BlackSpy