Variables globales ASP.NET MVC

Comment déclarez-vous les variables globales dans ASP.NET MVC?

public static class GlobalVariables { // readonly variable public static ssortingng Foo { get { return "foo"; } } // read-write variable public static ssortingng Bar { get { return HttpContext.Current.Application["Bar"] as ssortingng; } set { HttpContext.Current.Application["Bar"] = value; } } } 

Techniquement, toute variable statique ou propriété d’une classe, n’importe où dans votre projet, sera une variable globale, par exemple

 public static class MyGlobalVariables { public static ssortingng MyGlobalSsortingng { get; set; } } 

Mais comme le dit @SLaks, ils peuvent être “potentiellement” mauvais et dangereux s’ils ne sont pas gérés correctement. Par exemple, dans l’exemple ci-dessus, vous auriez plusieurs requêtes (threads) essayant d’accéder à la même propriété, ce qui pourrait poser problème si c’était un type complexe ou une collection, vous devriez implémenter une forme de locking.

Vous pouvez les mettre dans l’application:

 Application["GlobalVar"] = 1234; 

Ils ne sont globaux que dans l’application IIS / Virtual actuelle. Cela signifie que sur un site Web, ils sont locaux sur le serveur et dans le répertoire virtuel qui est la racine de l’application.

Pour les variables non statiques , je l’ai sortingé via le dictionnaire de classes d’application ci-dessous:

Chez 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 ssortingng _licensefile; // the global private variable internal ssortingng LicenseFile // the global controlled variable { get { if (Ssortingng.IsNullOrEmpty(_licensefile)) { ssortingng 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); } } } 

Et dans le contrôleur:

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

De cette façon, nous pouvons avoir des variables globales dans ASP.NET MVC 🙂

REMARQUE: Si votre object n’est pas une chaîne, écrivez simplement:

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

Vous pouvez également utiliser une classe statique, telle qu’une classe Config ou quelque chose du genre …

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

L’acier est loin d’être chaud, mais j’ai combiné la solution de @abatishchev avec la réponse de cet article et j’ai abouti à ce résultat. J’espère que c’est utile:

 public static class GlobalVars { private const ssortingng 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(ssortingng varName) { if (Vars.ContainsKey(varName)) { return Vars[varName]; } return null; } private static void WriteVar(ssortingng 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; } } }