Variables globales de ASP.NET MVC

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

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

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

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

Pero como dice @SLaks, pueden ‘potencialmente’ ser 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 locking.

Puedes ponerlos en la aplicación:

 Application["GlobalVar"] = 1234; 

Solo son globales dentro de la aplicación IIS / Virtual actual. 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.

Para las variables no estáticas , lo ordené a través del diccionario de clases de aplicaciones 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 el 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 su objeto no es una cadena simplemente escriba:

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

También podría usar una clase estática, como una clase Config o algo parecido …

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

El acero está lejos de estar caliente, pero combiné la solución de @ abatishchev con la respuesta de esta publicación y obtuve este resultado. Espero que sea útil:

 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 SomeCollection { get { return GetVar("SomeCollection") as IEnumerable; } 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; } } }