Есть ли в asp.net MVC переменные приложения? - PullRequest
42 голосов
/ 15 февраля 2010

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

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

Ответы [ 6 ]

98 голосов
/ 17 сентября 2010

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

System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Name"] = "Value";
System.Web.HttpContext.Current.Application.UnLock();
7 голосов
/ 15 февраля 2010

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

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

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

4 голосов
/ 03 апреля 2013

Я реализовал что-то вроде ниже как переменную для расширения для состояния 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);
2 голосов
/ 15 февраля 2010

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

0 голосов
/ 14 февраля 2017

Вы можете объявить переменные приложения в 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;
0 голосов
/ 15 февраля 2010

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

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

...