Имеет ли ASP.NET MVC переменные приложения?
Я занимаюсь преобразованием веб-приложения в MVC и сохраняю некоторую информацию в переменных приложения, используемых несколькими арендаторами/учетными записями, чтобы сделать вещи более эффективными.
Я понимаю, что точка MVC заключается в том, чтобы держать вещи как можно более безстоящими, Sesion State имеет смысл иметь и существовать в MVC, но мы не хотим просто преобразовывать переменные Application в Session, поскольку мы предпочли бы иметь что-то более глобальное и более безопасный. Имеют ли приложения MVC переменные приложения? Я видел несколько примеров использования кеширования? Является ли это стандартным стандартом и насколько он надежный/безопасный по сравнению с состоянием Application/Session?
Ответы
Ответ 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;