Есть ли в asp.net MVC переменные приложения?
-
20-09-2019 - |
Вопрос
Я занят преобразованием веб-приложения в 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.
Однако я бы создал статический класс, который использует хранилище кеша в качестве поддержки.