it-swarm.com.de

Globale ASP.NET-MVC-Variablen

Wie deklarieren Sie globale Variablen in ASP.NET MVC?

66
Beginner
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;
        }
    }
}
43
abatishchev

Technisch gesehen ist jede statische Variable oder Eigenschaft einer Klasse irgendwo in Ihrem Projekt eine globale Variable, z.

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

Aber wie @SLaks sagt, können sie "potentiell" schlechte Praxis darstellen und gefährlich sein, wenn sie nicht korrekt gehandhabt werden. In diesem Beispiel hätten Sie beispielsweise mehrere Anforderungen (Threads), die versuchen, auf dieselbe Property zuzugreifen. Dies könnte ein Problem sein, wenn es sich um einen komplexen Typ oder eine Auflistung handelt und Sie eine Art Sperren implementieren müssten.

77
Sunday Ironfoot

Sie können sie in die Anwendung einfügen:

Application["GlobalVar"] = 1234;

Sie sind nur global in der aktuellen IIS/Virtuellen Anwendung. Dies bedeutet, dass sie sich auf einer Webfarm lokal auf dem Server befinden und innerhalb des virtuellen Verzeichnisses, das das Stammverzeichnis der Anwendung ist.

24
GvS

Für nicht statisch variables habe ich es über Anwendungsklassenwörterbuch wie folgt aussortiert:

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);
18
Yasser Zamani

Sie können auch eine statische Klasse verwenden, z. B. eine Config-Klasse oder etwas Ähnliches.

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

Der Stahl ist alles andere als heiß, aber ich kombinierte die Lösung von @ abatishchev mit der Antwort von diesem Beitrag und kam zu diesem Ergebnis. 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;
        }
    }
}
0
paulo.vin