Статический класс Ссылка на объект не установлена для экземпляра объекта
У меня есть следующий статический класс:
public static class GlobalVar
{
public static string DatabaseName = "ProjectDatabase.mdf";
public static AdminClass Admin;
public static string TruePath = AppDomain.CurrentDomain.BaseDirectory;
public static string TimeStampPattern = "dd/MM/yyyy HH:mm";
static GlobalVar()
{
TruePath = TruePath.Remove(TruePath.Length - 1);
Admin = new AdminClass("Admin", "Admin");
GlobalStatus = new Dictionary<string, string>();
string Query = "SELECT * FROM global_status";
DataTable Types = MyAdoHelper.ExecuteDataTable(GlobalVar.DatabaseName, Query);
foreach (DataRow Status in Types.Rows)
{
GlobalStatus.Add(Status["title"].ToString(), Status["info"].ToString());
}
}
public static Dictionary<string, string> GlobalStatus;
public static string BasePath = HttpContext.Current.Request.ApplicationPath;
}
GlobalStatus - это словарь, получающий пользовательские ошибки, которые может возвращать сайт. Когда я запускаю проект (Microsoft Visual Web developer 2008), он выдает ошибку:
Object reference not set to an instance of an object.
при попытке получить значение из GlobalStatus (например, GlobalVar.GlobalStatus["Page_NoAccess"]).
Только через минуту, когда я снова запускаю проект, он работает нормально.
Как я могу это исправить, например заставить браузер подождать, пока он не заполнит GlobalStatus. Мне нужно, чтобы этот класс инициализировался только один раз, так как он содержит глобальные переменные, которые я не хочу вызывать при каждом запросе браузера.
Спасибо
1 ответ
Прежде всего, я хочу предложить вам глобальную концепцию vars в объектно-ориентированном коде - плохая идея.
Чтобы решить вашу проблему, вам нужно использовать встроенные, готовые подходы ASP.NET: глобальный класс приложений.
использование Application_Start
обработчик события и вызов процесса инициализации во время этого события.
Все, что противоречит вышеизложенному, является плохой идеей.
Теперь... как это сделать лучше
- Для всего, что вы найдете в настройках, используйте AppSettings или файлы настроек.
- Использование статических конструкторов для инициализации приложения - плохая идея. Создайте статический класс со статическими методами, такими как
Initialize()
,Start()
... Позвони им вApplication_Start
событие глобального класса приложений. - Статические классы со статическими полями и данными в многопоточной среде, такой как ASP.NET, являются большим провалом. Более чем один поток может сразу инициализировать ваше приложение. Как ваш код управляет этой ситуацией?,
- Забудьте о концепции глобальных переменных в объектно-ориентированном программном обеспечении. Используйте настройки (как я сказал в 1-й точке) или создайте константы или поля (статические или экземпляры) как часть класса, который будет его использовать.
ОБНОВЛЕНИЕ И ПРИМЕЧАНИЕ. Я предлагаю эту статью MSDN о статических конструкторах, чтобы понять, почему это плохая идея при инициализации ASP.NET.