Как вы объявляете глобальные переменные в ASP.NET MVC?
Глобальные переменные ASP.NET MVC
Ответ 1
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;
}
}
}
Ответ 2
Технически любая статическая переменная или Свойство в классе в любом месте вашего проекта будет глобальной переменной, например.
public static class MyGlobalVariables
{
public static string MyGlobalString { get; set; }
}
Но, как говорит @SLaks, они могут "потенциально" быть плохой практикой и опасны, если их не обрабатывать правильно. Например, в приведенном выше примере у вас будет несколько запросов (потоков), пытающихся получить доступ к одному и тому же свойству, что может быть проблемой, если это сложный тип или коллекция, вам придется реализовать некоторую форму блокировки.
Ответ 3
Вы можете поместить их в приложение:
Application["GlobalVar"] = 1234;
Они являются глобальными только в рамках текущего приложения IIS/Virtual. Это означает, что на webfarm они локальны для сервера и внутри виртуального каталога, который является корнем приложения.
Ответ 4
Для нестатических переменных я отсортировал их с помощью Словаря класса приложений, как показано ниже:
В 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 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);
Ответ 5
Вы также можете использовать статический класс, например, класс Config или что-то в этом роде...
public static class Config
{
public static readonly string SomeValue = "blah";
}
Ответ 6
Сталь далеко не горячая, но я скомбинировал решение @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;
}
}
}