Pregunta

Estoy ocupado conversión de una aplicación web para MVC y tener alguna información guardada en variables de aplicación utilizados a través de múltiples inquilinos / cuentas para hacer las cosas un poco más eficiente.

Me di cuenta el punto de MVC es mantener las cosas como sin estado como sea posible, Sesion Estado, obviamente, tiene sentido tener y existe en MVC, pero no queremos convertir sólo de aplicación a las variables de sesión como preferimos tener algo más global y más seguro. Qué aplicaciones MVC tienen variables de aplicación? He visto algunos ejemplos en los que se utiliza el almacenamiento en caché? Está presente ahora de serie y cómo robusta / seguro se esta comparación con la aplicación / el estado de sesión?

¿Fue útil?

Solución

Sí, se puede acceder a las variables de aplicación de .NET MVC. He aquí cómo:

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

Otros consejos

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

clases estáticas parece una opción popular aquí. Sin embargo clases estáticas crean dependencias entre sus tipos y hacen versiones / prueba más difícil. También es un pedazo de un modelo extraño a utilizar en un marco que está diseñado para romper este tipo de dependencias. Por ejemplo, el marco ASP.NET estándar está plagado de la estática y tipos sellados. Estos son todos reemplazados con casos simulados-able.

"seguro" es un poco claro en este contexto. Exactamente ¿qué es lo que quiere decir con "seguro?"

He implementado algo parecido a continuación como una extensión para la variable de estado global. Pongo cosas como el título del sitio, Servicio Endpoints, 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 se puede configurar 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);

Hacer una clase estática?

Se pueden declarar variables de aplicación en Application_Start como esto:

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

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

Para acceder a este en el controlador de escritura:

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

¿Tienen variables de aplicación? Sí, MVC es un marco que se encuentra en la parte superior del marco asp.net normal.

Me sin embargo, una clase estática que utiliza un almacén de caché, ya que está retrocediendo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top