Вопрос

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

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

Это было полезно?

Решение

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

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

Другие советы

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

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

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

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

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.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top