web-dev-qa-db-fra.com

Asp.net MVC a-t-il des variables d'application?

Je suis en train de convertir une application Web en MVC et de sauvegarder certaines informations en variables d'application utilisées par plusieurs clients/comptes afin de rendre les choses un peu plus efficaces.

Je me rends compte que le but de MVC est de garder les choses aussi apatrides que possible. Sesion State a évidemment du sens d’avoir et existe dans MVC mais nous ne voulons pas simplement convertir les variables Application en Session, nous préférerions avoir quelque chose de plus global et plus sécurisé. Les applications MVC ont-elles des variables d'application? J'ai vu des exemples d'utilisation de la mise en cache? Est-ce maintenant standard et quelle est la solidité/sécurité par rapport à l'état de l'application/de la session?

42
Mark Redman

Oui, vous pouvez accéder aux variables d'application à partir de .NET MVC. Voici comment:

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

L'état de session ou le cache sont de meilleurs choix. Ils sont mockables dans MVC et sont conçus pour stocker des données de session et d'application.

Les classes statiques semblent être un choix populaire ici. Cependant, les classes statiques créent des dépendances entre vos types et rendent plus difficile le contrôle de version/test. C'est aussi un motif étrange à utiliser dans un cadre conçu pour dissocier ces types de dépendances. Par exemple, le framework ASP.NET standard est truffé de statiques et de types scellés. Celles-ci sont toutes remplacées par des instances simulables. 

"Sécurisé" est un peu flou dans ce contexte. Qu'entendez-vous exactement par "sécurisé?"

7
Will

J'ai implémenté quelque chose comme ci-dessous en tant que variable d'état Extension for Global. Je mets des choses comme le titre du site, les points de terminaison du service, les rôles autorisés

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;
    }
}

Donc, je peux les définir à partir de Global.asax.cs quelque chose comme ça 

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

ou

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

Faire un cours statique?

2
svinto

Vous pouvez déclarer les variables d'application dans Application_Start comme ceci:

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

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

Pour accéder à cela sur le contrôleur, écrivez:

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

Ont-ils des variables d'application? Oui, MVC est un framework qui repose sur le framework asp.net normal.

Cependant, je créerais une classe statique qui utilise un cache store comme sauvegarde.

0
used2could