Variabili globali ASP.NET MVC

Come si dichiarano le variabili globali in 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; } } } 

Tecnicamente qualsiasi variabile statica o Property su una class, ovunque nel tuo progetto, sarà una variabile Globale es

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

Ma come dice @SLaks, possono “potenzialmente” essere pratiche sbagliate e pericolose, se non gestite correttamente. Ad esempio, in questo esempio precedente, avresti più richieste (thread) che tentano di accedere alla stessa proprietà, che potrebbe essere un problema se fosse un tipo complesso o una collezione, dovresti implementare qualche forma di blocco.

Puoi metterli nell’applicazione:

 Application["GlobalVar"] = 1234; 

Sono solo globali all’interno dell’attuale applicazione IIS / Virtual. Ciò significa che su una webfarm sono locali al server e all’interno della directory virtuale che costituisce la radice dell’applicazione.

Per variabili non statiche , l’ho risolto tramite il dizionario della class dell’applicazione come di seguito:

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

E in Controller:

 namespace MvcWebApplication.Controllers { public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { return View(HttpContext.Application["LicenseFile"] as string); } } } 

In questo modo possiamo avere variabili globali in ASP.NET MVC 🙂

NOTA: se il tuo object non è una stringa, scrivi semplicemente:

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

Puoi anche usare una class statica, come una class Config o qualcosa del genere …

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

L’acciaio è tutt’altro che caldo, ma ho combinato la soluzione di @abatishchev con la risposta di questo post e ho raggiunto questo risultato. Spero sia utile:

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