6 ответов:
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; } } }
технически любая статическая переменная или свойство класса, в любом месте вашего проекта, будет глобальной переменной, например
public static class MyGlobalVariables { public static string MyGlobalString { get; set; } }но, как говорит @SLaks, они могут "потенциально" быть плохой практикой и опасными, если не обрабатываются правильно. Например, в приведенном выше примере у вас будет несколько запросов (потоков), пытающихся получить доступ к одному и тому же свойству, что может быть проблемой, если это сложный тип или коллекция, вам придется реализовать некоторую форму блокировки.
вы можете поместить их в приложение:
Application["GlobalVar"] = 1234;они являются глобальными только в текущем IIS / виртуальном приложении. Это означает, что на веб-ферме они являются локальными для сервера и в виртуальном каталоге, который является корнем приложения.
на нестатические переменные, я разобрался с помощью словарь классов приложений как показано ниже:
At 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:)
Примечание: Если ваш объект не является строкой просто написать:
return View(HttpContext.Application["X"] as yourType);
вы также можете использовать статический класс, такой как класс конфигурации или что-то в этом роде...
public static class Config { public static readonly string SomeValue = "blah"; }
стали далеко не жарко, но я совместил решение @abatishchev с ответом Из этот пост и добрался до такого результата. Надеюсь, что это полезно:
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; } } }
Comments