2011-02-25 96 views
59

¿Cómo declaras las variables globales en ASP.NET MVC?ASP.NET MVC Global Variables

+1

Su respuesta es - [MVC - ¿Cómo declarar variables globales] (http://stackoverflow.com/questions/4171089/how-to-define-a-global-variable-in- asp-net-web-app) - [Variables globales en ASP.NET MVC] (http://stackoverflow.com/questions/2974542/how-to-declare-a-global-variable-at-an-aspx-page) –

+0

@SLaks Es muy útil cuando se quiere crear un prototipo rápido y sucio para un cliente. Los diseños pobres y las malas prácticas no importan en absoluto cuando se realiza una demostración de UI preventa desechable. – romanoza

Respuesta

41
public static class GlobalVariables 
{ 
    // readonly variable 
    public static string Foo 
    { 
     get 
     { 
      return "foo"; 
     } 
    } 

    // read-write variable 
    public static string Bar 
    { 
     get 
     { 
      return HttpContext.Current.Application["Bar"] as string; 
     } 
     set 
     { 
      HttpContext.Current.Application["Bar"] = value; 
     } 
    } 
} 
+0

¿Por qué usar la clase de aplicación? El objeto de aplicación se usa para compatibilidad con ASP más antiguo. Además, Microsoft dice: "Esto aumenta el rendimiento porque puede acceder a una variable estática más rápido de lo que puede acceder a un elemento en el diccionario de la aplicación". Fuente: [enlace] (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607) –

+0

@wishmesh: De acuerdo. Por otro lado, ¿se guardarán las variables estáticas si la máquina de estado basada en la base de datos está encendida? – abatishchev

+1

Tiene razón. Parece que el "enfoque de variable estática" puede fallar en el jardín web y en otros escenarios. –

23

puede ponerlos en la Solicitud:

Application["GlobalVar"] = 1234; 

Sólo están global dentro de la corriente de IIS/applicition virtual. Esto significa que en una granja web son locales al servidor y dentro del directorio virtual que es la raíz de la aplicación.

7

También es posible usar una clase estática, como una clase de configuración o algo por el estilo ...

public static class Config 
{ 
    public static readonly string SomeValue = "blah"; 
} 
75

Técnicamente cualquier variable estática o la propiedad de una clase, en cualquier parte de su proyecto, será una variable global, por ejemplo,

public static class MyGlobalVariables 
{ 
    public static string MyGlobalString { get; set; } 
} 

Pero como dice @SLaks, pueden ser 'potencialmente' malas prácticas y peligrosas si no se manejan correctamente. Por ejemplo, en el ejemplo anterior, usted tendría múltiples solicitudes (hilos) tratando de acceder a la misma Propiedad, lo que podría ser un problema si fuera un tipo complejo o una colección, tendría que implementar alguna forma de bloqueo.

+8

Mi voto favorable. De hecho, según Microsoft, esta es una forma preferida de usar variables globales (estáticas) debido al rendimiento. Y el objeto Aplicación se usa para compatibilidad con ASP antiguo. Lea más aquí: [enlace] (http://support.microsoft.com/default.aspx?scid=kb;en-us;Q312607). Tanto AFAIK estática como Application requieren bloqueos si se piensa en seguridad de subprocesos y concurrencia, ya que si la aplicación es segura para subprocesos, los datos a los que está accediendo pueden no serlo. –

+0

Las clases estáticas no son seguras para sesión, es decir. en el mismo momento, 2 solicitudes simultáneas de 2 usuarios compartirán la misma variable, por lo que se estropearán los datos. Para que la sesión del usuario sea segura, creo que debe ser algo como abatishchev mencionado. –

+0

Estoy de acuerdo con @Sunday y creo que esta debería marcar como respuesta correcta; sin embargo, la mejor manera de hacerlo es implementar un patrón de singleton seguro para subprocesos, como: http://csharpindepth.com/Articles/General/Singleton .aspx – Tohid

18

Para variables no estáticas, que resolvieron todo a través de aplicación de diccionario clase de la siguiente manera:

En Global.asax.ac:

namespace MvcWebApplication 
{ 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.microsoft.com/?LinkId=9394801 

    public class MvcApplication : System.Web.HttpApplication 
    { 
     private string _licensefile; // the global private variable 

     internal string LicenseFile // the global controlled variable 
     { 
      get 
      { 
       if (String.IsNullOrEmpty(_licensefile)) 
       { 
        string tempMylFile = Path.Combine(Path.GetDirectoryName(Assembly.GetAssembly(typeof(LDLL.License)).Location), "License.l"); 
        if (!File.Exists(tempMylFile)) 
         File.Copy(Server.MapPath("~/Content/license/License.l"), 
          tempMylFile, 
          true); 
        _licensefile = tempMylFile; 
       } 
       return _licensefile; 
      } 
     } 
     protected void Application_Start() 
     { 
      Application["LicenseFile"] = LicenseFile;// the global variable's bed 

      AreaRegistration.RegisterAllAreas(); 

      RegisterGlobalFilters(GlobalFilters.Filters); 
      RegisterRoutes(RouteTable.Routes); 
     } 
    } 
} 

Y en Controlador:

namespace MvcWebApplication.Controllers 
{ 
    public class HomeController : Controller 
    { 
     // 
     // GET: /Home/ 

     public ActionResult Index() 
     { 
      return View(HttpContext.Application["LicenseFile"] as string); 
     } 

    } 
} 

De esta forma podemos tener variables globales en ASP.NET MVC :)

NOTA: Si el objeto no es una cadena escribir simplemente:

return View(HttpContext.Application["X"] as yourType); 
+2

Cabe señalar que la esencia de su respuesta es "utilizar el diccionario de la clase' Application'. –

+0

Muchas gracias @AndrewBarber, actualicé mi respuesta! –

+0

@YasserZamani eso es perfecto, pero ¿cómo modificar las variables globales en el controlador? Cada vez que cambié el valor, perdió en otras solicitudes. –

0

El acero está lejos de calor, pero he combinado @ solución de abatishchev con la respuesta de this post y llegó a este resultado. Esperamos que sea de utilidad:

public static class GlobalVars 
{ 
    private const string GlobalKey = "AllMyVars"; 

    static GlobalVars() 
    { 
     Hashtable table = HttpContext.Current.Application[GlobalKey] as Hashtable; 

     if (table == null) 
     { 
      table = new Hashtable(); 
      HttpContext.Current.Application[GlobalKey] = table; 
     } 
    } 

    public static Hashtable Vars 
    { 
     get { return HttpContext.Current.Application[GlobalKey] as Hashtable; } 
    } 

    public static IEnumerable<SomeClass> SomeCollection 
    { 
     get { return GetVar("SomeCollection") as IEnumerable<SomeClass>; } 
     set { WriteVar("SomeCollection", value); } 
    } 

    internal static DateTime SomeDate 
    { 
     get { return (DateTime)GetVar("SomeDate"); } 
     set { WriteVar("SomeDate", value); } 
    } 

    private static object GetVar(string varName) 
    { 
     if (Vars.ContainsKey(varName)) 
     { 
      return Vars[varName]; 
     } 

     return null; 
    } 

    private static void WriteVar(string varName, object value) 
    { 
     if (value == null) 
     { 
      if (Vars.ContainsKey(varName)) 
      { 
       Vars.Remove(varName); 
      } 
      return; 
     } 

     if (Vars[varName] == null) 
     { 
      Vars.Add(varName, value); 
     } 
     else 
     { 
      Vars[varName] = value; 
     } 
    } 
} 
Cuestiones relacionadas