Однако существует только одна копия статических данных. Которая используется для всех экземпляров.
Еще одно требование — вы обязательно должны добавить в директиву Application атрибут ClassName, чтобы присвоить имя глобальному классу приложения, которое вам придется использовать для извлечения только что созданного статического значения.
Конечно, для наилучшей инкапсуляции (или наибольшей гибкости), вам следует использовать процедуры свойств:
private static string[] fileList;
public static string[] FileList
{
get { return fileList; }
}
Добавляемая в файл global.asax переменная экземпляра обладает, по сути, теми же характеристиками, что и значение в коллекции Application. Другими словами, вы можете использовать любой тип данных .NET, значение сохраняется до перезапуска домена приложения и состояние не передается между несколькими компьютерами. Однако механизм автоматической блокировки отсутствует. Поскольку попытаться получить доступ и изменить значение могут одновременно несколько пользователей, вам следует использовать С#-оператор блокировки, чтобы на время ограничить переменную одним единственным потоком. В зависимости от того, как осуществляется доступ к вашим данным, вы можете выполнить блокировку в коде Web-страницы (в таком случае вы сможете выполнить одновременно несколько задач с заблокированными данными) или в процедурах свойств или методах в файле global.asax (в таком случае блокировка будет удерживаться в течение наименьшего возможного времени). Ниже показан пример процедуры свойства, которая обслуживает безопасную к потокам глобальную коллекцию метаданных:
private static Dictionary<string, string> metadata =
new Dictianary<string, string>();
public void AddMetadata (string key, string value)
(
lock (metadata)
{
metadata[key] = value;
}
}
public string GetMetadata(string key)
{
lock (metadata)
{
return metadata[key];
}
}
Подход, подразумевающий применение переменных экземпляра (вместо коллекции Application), имеет два преимущества. Во-первых, он позволяет написать специальный код в процедуре свойства. Этот код может отслеживать количество раз, которое получается доступ к значению, проверять, являются ли данные еще действительными, или воссоздавать их. Ниже в качестве примера приводится фрагмент кода, который использует схему отложенной инициализации и создает глобальный объект только тогда, когда он запрашивается впервые:
предыдущая следующая страница оглавление
293