que net codigo code asp c# asp.net-mvc application-state

c# - codigo - ¿Asp.net MVC tiene variables de aplicación?



variables asp net (6)

¿Hacer una clase estática?

Estoy ocupado en convertir una aplicación web a MVC y tengo algo de información guardada en las variables de la aplicación que se utilizan en varios inquilinos / cuentas para hacer las cosas un poco más eficientes.

Me doy cuenta de que el objetivo de MVC es mantener las cosas lo más apátridas posible, Sesion State obviamente tiene sentido tener y existe en MVC, pero no queremos convertir las variables Application to Session ya que preferiríamos tener algo más global y seguro. ¿Las aplicaciones MVC tienen variables de aplicación? He visto algunos ejemplos donde se utiliza el almacenamiento en caché? ¿Es esto ahora estándar y qué tan robusto / seguro es esto en comparación con el estado de aplicación / sesión?


¿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 utiliza un almacén de caché como respaldo.


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

Las clases estáticas 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 tanto extraño para usar en un marco que está diseñado para separar este tipo de dependencias. Por ejemplo, el marco estándar de ASP.NET está plagado de tipos estáticos y sellados. Todos estos son reemplazados por instancias simulables.

"Seguro" es un poco confuso en este contexto. Exactamente, ¿qué quiere decir con "seguro"?


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

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

Así que puedo configurarlos desde Global.asax.cs algo como esto

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

o

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


Puede declarar variables de Application_Start en Application_Start esta manera:

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

Para acceder a esto en el controlador escriba:

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


Sí, puede acceder a las variables de la 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();