2010-03-15 23 views
40

¿Cómo puedo establecer una variable global en una aplicación web C#?Variables globales en C# .net

Lo que quiero hacer es establecer una variable en una página (página maestra tal vez) y acceder a esta variable desde cualquier página.

No quiero usar caché ni sesiones.

Creo que tengo que usar global.asax. ¿Alguna ayuda?

+0

¿Existe una razón cache/sesión en particular no trabajará?Técnicamente, la Aplicación es un objeto de Sesión/Caché y, por lo tanto, si está utilizando eso (de una manera no estática), ya está utilizando Sesiones. Si es la parte específica de la sesión, puede abordarse con la caché del nivel de la aplicación. – GrayWizardx

+0

sí, porque necesito almacenar una lista grande, y el caché es solo de 16 MB, así que no quiero desperdiciar recursos de cahe ... – scatman

+0

¿Desea un singleton? ¿Un único objeto compartido por * todos * hilos que manejan * todas * las solicitudes? O simplemente desea una forma de compartir datos entre una página maestra y una página de contenido. Si es el último, entonces las variables globales ciertamente no son una buena solución. – tarn

Respuesta

95

Usa una clase pública estática y accede desde cualquier lugar.

public static class MyGlobals { 
    public const string Prefix = "ID_"; // cannot change 
    public static int Total = 5; // can change because not const 
} 

utilizado como tal, desde la página principal o en cualquier lugar:

string strStuff = MyGlobals.Prefix + "something"; 
textBox1.Text = "total of " + MyGlobals.Total.ToString(); 

No es necesario hacer una instancia de la clase; de hecho, no puedes porque es estático. new Simplemente úselo directamente. Todos los miembros dentro de una clase estática también deben ser estáticos. El Prefijo de cadena no está marcado como estático porque const es implícitamente estático por naturaleza.

La clase estática puede estar en cualquier lugar de su proyecto. No tiene que ser parte de Global.asax o de ninguna página en particular porque es "global" (o al menos lo más cercano que podamos llegar a ese concepto en términos orientados a objetos).

Puede hacer tantas como Clases estáticas como quieras y nómbralas como quieras.


A veces a los programadores les gusta agrupar sus constantes utilizando clases estáticas anidadas. Por ejemplo,

public static class Globals { 
    public static class DbProcedures { 
     public const string Sp_Get_Addresses = "dbo.[Get_Addresses]"; 
     public const string Sp_Get_Names = "dbo.[Get_First_Names]"; 
    } 
    public static class Commands { 
     public const string Go = "go"; 
     public const string SubmitPage = "submit_now"; 
    } 
} 

y acceder a ellos de esta manera:

MyDbCommand proc = new MyDbCommand(Globals.DbProcedures.Sp_Get_Addresses); 
proc.Execute(); 
//or 
string strCommand = Globals.Commands.Go; 
+2

+1 para una solución elegante, lindo, me gusta. – SoftwareGeek

4

Me segunda respuesta de JDK: cualquier miembro estático público de cualquier clase de su aplicación puede ser considerado como una "variable global".

Sin embargo, tenga en cuenta que esta es una aplicación ASP.NET, y como tal, es un multi-threaded contexto para sus variables globales. Por lo tanto, debe usar algún mecanismo de bloqueo cuando actualice y/o lea los datos a/desde estas variables. De lo contrario, podría obtener sus datos en un estado dañado.

+0

¿es esto un inconveniente solo para las variables globales? o para el caché también? – scatman

+0

AFAIK, los métodos públicos del objeto Cache que viene con una aplicación ASP.NET son seguros para subprocesos. Pero echa un vistazo a la documentación ... –

3

Puede crear una clase base en su aplicación que hereda de System.Web.UI.Page. Deje que todas sus páginas hereden de la clase base recién creada. Agregue una propiedad o una variable a su clase base con el modificador de acceso previsto, de modo que se acceda desde todas sus páginas en la aplicación.

-3

Simplemente declare la variable al inicio de una clase.

p. Ej. para la variable de cadena:

public partial class Login : System.Web.UI.Page 
{ 
    public string sError; 

    protected void Page_Load(object sender, EventArgs e) 
    { 
     //Page Load Code 
    } 
0
/// <summary> 
/// Contains global variables for project. 
/// </summary> 
public static class GlobalVar 
{ 
/// <summary> 
/// Global variable that is constant. 
/// </summary> 
public const string GlobalString = "Important Text"; 

/// <summary> 
/// Static value protected by access routine. 
/// </summary> 
static int _globalValue; 

/// <summary> 
/// Access routine for global variable. 
/// </summary> 
public static int GlobalValue 
{ 
get 
{ 
    return _globalValue; 
} 
set 
{ 
    _globalValue = value; 
} 
} 

/// <summary> 
/// Global static field. 
/// </summary> 
public static bool GlobalBoolean; 
}