Есть ли в asp.net MVC переменные приложения?

Я занят преобразованием веб-приложения в MVC и сохраняю некоторую информацию в переменных приложения, которые используются несколькими арендаторами / учетными записями для повышения эффективности.

Я понимаю, что смысл MVC состоит в том, чтобы держать вещи как можно без состояний, Sesion State, очевидно, имеет смысл иметь и существует в MVC, но мы не хотим просто преобразовывать переменные Application в Session, так как мы предпочли бы иметь что-то более глобальное и более безопасное. Есть ли в приложениях MVC переменные приложения? Я видел несколько примеров, где используется кэширование? Является ли это сейчас стандартом и насколько надежно / безопасно это по сравнению с Application/Session State?

6 ответов

Решение

Да, вы можете получить доступ к переменным приложения из.NET MVC. Вот как:

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

Состояние сеанса или Cache - лучший выбор. Они поддаются моделированию в MVC и предназначены для хранения данных сессий и приложений.

Статические классы здесь кажутся популярным выбором. Однако статические классы создают зависимости между вашими типами и затрудняют управление версиями / тестирование. Это также немного странный шаблон для использования в платформе, которая предназначена для разделения этих видов зависимостей. Например, стандартная структура ASP.NET пронизана статическими и закрытыми типами. Все они заменены на поддельные экземпляры.

"Безопасный" немного неясен в этом контексте. Что именно вы подразумеваете под "безопасным"?

Я реализовал что-то вроде ниже как переменную для расширения для состояния Global. Я ставлю такие вещи, как название сайта, конечные точки службы, авторизованные роли

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

Так что я могу установить их из Global.asax.cs примерно так

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

или же

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

Вы можете объявить переменные приложения в Application_Start как это:

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

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

Чтобы получить доступ к этому на контроллере, напишите:

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

Сделать статический класс?

У них есть переменные приложения? Да, MVC - это фреймворк, который находится поверх обычного фреймворка asp.net.

Однако я бы создал статический класс, который использует кеш-хранилище в качестве поддержки.

Другие вопросы по тегам