¿Asp.net MVC tiene variables de aplicación?

Estoy ocupado convirtiendo una aplicación web a MVC y tengo cierta información guardada en variables de aplicación utilizadas en varios inquilinos / cuentas para hacer las cosas un poco más eficientes.

Me doy cuenta de que el objective de MVC es mantener las cosas tan apagadas como sea posible, Sesion State obviamente tiene sentido para tener y existir en MVC, pero no queremos simplemente convertir las variables Aplicación a Sesión ya que preferiríamos tener algo más global y más seguro. ¿Las aplicaciones MVC tienen variables de aplicación? He visto algunos ejemplos donde se usa el almacenamiento en caché? ¿Es esto ahora estándar y qué tan robusto / seguro es esto comparado con el estado de la aplicación / sesión?

Sí, puede acceder a las variables de aplicación desde .NET MVC. Así es cómo:

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

El estado de la sesión o el caché son mejores opciones. Se pueden simular en MVC y están diseñados para almacenar datos de sesión y de ámbito de aplicación.

Las clases de estática parecen ser una opción popular aquí. Sin embargo, las clases estáticas crean dependencias entre sus tipos y hacen que las versiones / pruebas sean más difíciles. También es un patrón un poco extraño para usar en un marco que está diseñado para romper este tipo de dependencias. Por ejemplo, el marco estándar de ASP.NET está plagado de estática y tipos sellados. Todos estos se reemplazan con instancias simuladas.

“Seguro” es un poco confuso en este contexto. ¿A qué te refieres con “seguro”?

Implementé algo como a continuación como una extensión para la variable de estado Global. Puse cosas como título del sitio, puntos finales del servicio, roles autorizados

 public static class ApplicationStateExtension { public static T GetSetApplicationState(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(this HttpApplicationState appState, string objectName) { T retVal = default(T); appState.Lock(); if (appState[objectName] != null) retVal = (T)appState[objectName]; appState.UnLock(); return retVal; } } 

Entonces puedo configurarlos desde Global.asax.cs algo como esto

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

o

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

Hacer una clase estática?

¿Tienen variables de aplicación? Sí, MVC es un marco que se encuentra sobre el marco asp.net normal.

Sin embargo, crearía una clase estática que usa una memoria caché como respaldo.

Puede declarar variables de Application_Start en Application_Start así:

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

Para acceder a esto en el controlador escribe:

 string appVar = HttpContext.Application["value"] as string; 
Intereting Posts