web-dev-qa-db-de.com

Hat asp.net MVC Anwendungsvariablen?

Ich bin damit beschäftigt, eine Webanwendung in MVC zu konvertieren, und einige Informationen werden in Anwendungsvariablen gespeichert, die von mehreren Mandanten/Konten verwendet werden, um die Dinge ein bisschen effizienter zu gestalten.

Ich verstehe, dass es bei MVC darauf ankommt, die Dinge möglichst staatenlos zu halten. Sesion State ist offensichtlich in MVC vorhanden und existiert auch, aber wir wollen nicht einfach Application-in-Session-Variablen konvertieren, da wir lieber etwas globaleres und sichereres haben. Verfügen MVC-Anwendungen über Anwendungsvariablen? Ich habe einige Beispiele gesehen, bei denen Caching verwendet wird. Ist dies jetzt Standard und wie robust/sicher ist dies im Vergleich zum Anwendungs-/Sitzungsstatus?

42
Mark Redman

Ja, Sie können auf Anwendungsvariablen von .NET MVC aus zugreifen. Hier ist wie:

System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Name"] = "Value";
System.Web.HttpContext.Current.Application.UnLock();
97
WWC

Sitzungsstatus oder der Cache sind bessere Optionen. Sie können in MVC simuliert werden und sind zum Speichern von Sitzungs- und Anwendungsdaten gedacht.

Statischer Unterricht scheint hier eine beliebte Wahl zu sein. Statische Klassen schaffen jedoch Abhängigkeiten zwischen Ihren Typen und erschweren die Versionierung/das Testen. Es ist auch ein seltsames Muster, das in einem Framework verwendet werden soll, das diese Abhängigkeiten auflöst. Beispielsweise ist das Standard-ASP.NET-Framework mit Statik und versiegelten Typen durchsetzt. Diese werden alle durch mockfähige Instanzen ersetzt. 

"Sicher" ist in diesem Zusammenhang etwas unklar. Was genau meinen Sie mit "sicher"?

7
Will

Ich habe etwas wie folgt als Erweiterung für globale Zustandsvariable implementiert. Ich stelle Dinge wie Seitentitel, Service-Endpunkte, autorisierte Rollen

public static class ApplicationStateExtension
 {
    public static T GetSetApplicationState<T>(this HttpApplicationState appState, string objectName, object objectValue = null, int syncCheckMinutes = 0)
    {
        T retVal = default(T);
        appState.Lock();
        if (appState[objectName + "LastSync"] == null || DateTime.Now.Subtract(((DateTime)appState[objectName + "LastSync"])).TotalMinutes >= syncCheckMinutes)
        {
            appState[objectName + "LastSync"] = DateTime.Now;

            if (objectValue != null)
                appState[objectName] = objectValue;
        }
        if (appState[objectName] != null)
            retVal = (T)appState[objectName];
        appState.UnLock();
        return retVal;
    }
    public static object GetSetApplicationState(this HttpApplicationState appState, string objectName, object objectValue = null, int syncCheckMinutes = 0)
    {
        object retVal = null;
        appState.Lock();
        if (appState[objectName + "LastSync"] == null || DateTime.Now.Subtract(((DateTime)appState[objectName + "LastSync"])).TotalMinutes >= syncCheckMinutes)
        {
            appState[objectName + "LastSync"] = DateTime.Now;

            if (objectValue != null)
                appState[objectName] = objectValue;
        }
        if (appState[objectName] != null)
            retVal = appState[objectName];
        appState.UnLock();
        return retVal;
    }
    public static void SetApplicationState(this HttpApplicationState appState, string objectName, object objectValue, int syncCheckMinutes = 0)
    {
        appState.Lock();
        if (appState[objectName + "LastSync"] == null || DateTime.Now.Subtract(((DateTime)appState[objectName + "LastSync"])).TotalMinutes >= syncCheckMinutes)
        {
            appState[objectName + "LastSync"] = DateTime.Now;
            appState[objectName] = objectValue;
        }
        appState.UnLock();
    }
    public static object GetApplicationState(this HttpApplicationState appState, string objectName)
    {
        object retVal = null;
        appState.Lock();
        if (appState[objectName] != null)
            retVal = appState[objectName];
        appState.UnLock();
        return retVal;
    }
    public static T GetApplicationState<T>(this HttpApplicationState appState, string objectName)
    {
        T retVal = default(T);
        appState.Lock();
        if (appState[objectName] != null)
            retVal = (T)appState[objectName];
        appState.UnLock();
        return retVal;
    }
}

Also kann ich sie von Global.asax.cs so einstellen 

Application.SetApplicationState("UISiteTitle",paramHelper.GetUIConfigXML<XMLParams.UISiteOptions>("UISiteOptions")
                .SiteOptionCollection.Where(v => v.name.Equals("title", StringComparison.InvariantCultureIgnoreCase)).FirstOrDefault().value););

oder

var uiPermissions = Application.GetSetApplicationState<XMLParams.UIPermissions>("UIPermissions", paramHelper.GetUIConfigXML<XMLParams.UIPermissions>("UIPermissions"), 30);
4
C0r3yh

Eine statische Klasse machen?

2
svinto

Sie können Anwendungsvariablen wie folgt in Application_Start deklarieren:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    RouteConfig.RegisterRoutes(RouteTable.Routes);

    var e = "Hello";
    Application["value"] = e;
}

Um auf diesen Controller zuzugreifen, schreiben Sie:

string appVar = HttpContext.Application["value"] as string;
0
Rohul Amin

Haben sie Anwendungsvariablen? Ja, MVC ist ein Framework, das auf dem normalen asp.net-Framework sitzt.

Ich würde jedoch eine statische Klasse erstellen, die einen Cache-Speicher als Unterstützung verwendet.

0
used2could