Есть ли в asp.net MVC переменные приложения?
Я занят преобразованием веб-приложения в MVC и сохраняю некоторую информацию в переменных приложения, которые используются несколькими арендаторами / учетными записями для повышения эффективности.
Я понимаю, что смысл MVC состоит в том, чтобы держать вещи как можно без состояний, Sesion State, очевидно, имеет смысл иметь и существует в MVC, но мы не хотим просто преобразовывать переменные Application в Session, так как мы предпочли бы иметь что-то более глобальное и более безопасное. Есть ли в приложениях MVC переменные приложения? Я видел несколько примеров, где используется кэширование? Является ли это сейчас стандартом и насколько надежно / безопасно это по сравнению с Application/Session State?
6 ответов
Да, вы можете получить доступ к переменным приложения из.NET MVC. Вот как:
System.Web.HttpContext.Current.Application.Lock();
System.Web.HttpContext.Current.Application["Name"] = "Value";
System.Web.HttpContext.Current.Application.UnLock();
Состояние сеанса или Cache - лучший выбор. Они поддаются моделированию в MVC и предназначены для хранения данных сессий и приложений.
Статические классы здесь кажутся популярным выбором. Однако статические классы создают зависимости между вашими типами и затрудняют управление версиями / тестирование. Это также немного странный шаблон для использования в платформе, которая предназначена для разделения этих видов зависимостей. Например, стандартная структура ASP.NET пронизана статическими и закрытыми типами. Все они заменены на поддельные экземпляры.
"Безопасный" немного неясен в этом контексте. Что именно вы подразумеваете под "безопасным"?
Я реализовал что-то вроде ниже как переменную для расширения для состояния 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);
Вы можете объявить переменные приложения в 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.
Однако я бы создал статический класс, который использует кеш-хранилище в качестве поддержки.