Wie deklarieren Sie globale Variablen in ASP.NET MVC?
Wie deklarieren Sie globale Variablen in ASP.NET MVC?
Antworten:
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;
}
}
}
Technisch gesehen ist jede statische Variable oder Eigenschaft in einer Klasse an einer beliebigen Stelle in Ihrem Projekt eine globale Variable, z
public static class MyGlobalVariables
{
public static string MyGlobalString { get; set; }
}
Aber wie @SLaks sagt, können sie "möglicherweise" schlecht und gefährlich sein, wenn sie nicht richtig gehandhabt werden. In diesem obigen Beispiel hätten Sie beispielsweise mehrere Anforderungen (Threads), die versuchen, auf dieselbe Eigenschaft zuzugreifen. Dies könnte ein Problem sein, wenn es sich um einen komplexen Typ oder eine Sammlung handelt. Sie müssten eine Form der Sperrung implementieren.
Sie können sie in die Anwendung einfügen:
Application["GlobalVar"] = 1234;
Sie sind nur innerhalb der aktuellen IIS / Virtual-Anwendung global. Dies bedeutet, dass sie in einer Webfarm lokal auf dem Server und in dem virtuellen Verzeichnis sind, das das Stammverzeichnis der Anwendung ist.
Für nicht statische Variablen habe ich sie wie folgt über das Anwendungsklassenwörterbuch sortiert :
Bei 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);
}
}
}
Und im Controller:
namespace MvcWebApplication.Controllers
{
public class HomeController : Controller
{
//
// GET: /Home/
public ActionResult Index()
{
return View(HttpContext.Application["LicenseFile"] as string);
}
}
}
Auf diese Weise können wir globale Variablen in ASP.NET MVC haben :)
HINWEIS: Wenn Ihr Objekt keine Zeichenfolge ist, schreiben Sie einfach:
return View(HttpContext.Application["X"] as yourType);
Application
Klassenwörterbuch.
Der Stahl ist alles andere als heiß, aber ich habe die Lösung von @ abatishchev mit der Antwort aus diesem Beitrag kombiniert und bin zu diesem Ergebnis gekommen. Hoffe es ist nützlich:
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;
}
}
}