То, что вы на самом деле делаете, это Кэширование , и это здорово, поскольку вы уменьшаете количество обращений к внешнему хранилищу (базе данных или файлу, что угодно). Компромисс - использование памяти, конечно. Теперь практически любая современная веб-инфраструктура, включая ASP.NET, включает в себя некоторый механизм кэширования. Либо вы используете его, либо вы используете какую-то глобальную переменную.
Хранение данных во встроенном объекте ASP.NET Cache
имеет ряд существенных преимуществ, поскольку этот механизм фактически проверяет использование памяти и удаляет кэшированные данные в соответствии с некоторыми правилами.
Однако, если данные, которые вы хотите кэшировать, интенсивно используются во всем приложении и их размер не слишком велик (скажем, меньше 1 МБ), вы можете сохранить их как глобальную переменную.
В ASP.NET глобальные переменные достигаются либо с помощью объекта Application
, как вы описали в своем вопросе, либо путем записи общедоступных статических свойств / полей во внутреннем / общедоступном классе.
Вот мое решение для статических свойств. Обратите внимание, что я использую объект блокировки, чтобы защитить внутренние данные от повреждения. Это выглядит так:
public class WhateverClass
{
private static object theLocker = new object();
private static YourDataType theData;
public static YourDataType TheData
{
get
{
lock (theLocker)
{
return theData;
}
}
set
{
lock (theLocker)
{
theData = value;
}
}
}
}
Использование очень просто:
Первый раз, в Application_Start:
protected void Application_Start()
{
RegisterRoutes(RouteTable.Routes);
WhateverClass.TheData = loadDataFromSql();
}
В любом контроллере:
var myData = WhateverClass.TheData;
Этот подход лучше, потому что у вас есть безопасность типов, так как это открытое статическое свойство может быть явно объявлено с точным типом. Кроме того, этот тип хранилища является более тестируемым, поскольку он не зависит от веб-контекста.
НТН!