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

Je suis occupé à convertir une application Web en MVC et à enregistrer certaines informations dans les variables d’application utilisées sur plusieurs clients / comptes pour rendre les choses un peu plus efficaces.

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

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(); 

L’état de session ou le cache sont de meilleurs choix. Ils sont modifiables dans MVC et sont conçus pour stocker des données de session et de scope 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 le contrôle de version / test plus difficile. C’est aussi un modèle étrange à utiliser dans un framework conçu pour séparer ces types de dépendances. Par exemple, le framework ASP.NET standard est truffé de statiques et de types scellés. Ceux-ci sont tous remplacés par des instances pouvant être simulées.

“Secure” est un peu flou dans ce contexte. Que voulez-vous dire exactement par “sécurisé”?

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

 public static class ApplicationStateExtension { public static T GetSetApplicationState(this HttpApplicationState appState, ssortingng 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, ssortingng 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, ssortingng 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, ssortingng objectName) { object retVal = null; appState.Lock(); if (appState[objectName] != null) retVal = appState[objectName]; appState.UnLock(); return retVal; } public static T GetApplicationState(this HttpApplicationState appState, ssortingng 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("UISiteOptions") .SiteOptionCollection.Where(v => v.name.Equals("title", SsortingngComparison.InvariantCultureIgnoreCase)).FirstOrDefault().value);); 

ou

 var uiPermissions = Application.GetSetApplicationState("UIPermissions", paramHelper.GetUIConfigXML("UIPermissions"), 30); 

Faire une classe statique?

Ont-ils des variables d’application? Oui, MVC est un framework qui se trouve au dessus du framework asp.net normal.

Je créerais cependant une classe statique qui utilise un cache store comme support.

Vous pouvez déclarer des variables d’ Application_Start dans Application_Start comme ceci:

 protected void Application_Start() { AreaRegistration.RegisterAllAreas(); RouteConfig.RegisterRoutes(RouteTable.Routes); var e = "Hello"; Application["value"] = e; } 

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

 ssortingng appVar = HttpContext.Application["value"] as ssortingng;