Подтвердить что ты не робот

Имеет ли ASP.NET MVC переменные приложения?

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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

Ответ 3

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

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

Ответ 4

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

Ответ 5

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

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

Ответ 6

Вы можете объявить переменные приложения в 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;