ASP.NET MVC全局variables

你如何在ASP.NET MVC中声明全局variables?

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

从技术上讲,你的项目中的任何一个类的任何静态variables或属性将是一个全局variables,例如

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

但正如@SLaks所说,如果处理不当,他们可能会“不好”的做法和危险。 例如,在上面的例子中,你会有多个请求(线程)试图访问相同的属性,这可能是一个问题,如果它是一个复杂的types或集合,你将不得不实现某种forms的locking。

你可以把它们放在应用程序中:

 Application["GlobalVar"] = 1234; 

在目前的IIS /虚拟应用程序中,它们只是全局的。 这意味着,在一个webfarm上它们是服务器本地的,并且在作为应用程序根目录的虚拟目录中。

对于非静态variables,我通过Application类字典对它进行了sorting,如下所示:

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

在控制器中:

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

这样我们可以在ASP.NET MVC中拥有全局variables:)

注意:如果你的对象不是string,只需写:

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

你也可以使用一个静态类,比如一个Config类或类似的东西…

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

钢铁是远远不热,但我结合@ abatishchev的解决scheme与这个职位的答案,并得到了这个结果。 希望它是有用的:

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