Статический класс Ссылка на объект не установлена ​​для экземпляра объекта

У меня есть следующий статический класс:

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 обработчик события и вызов процесса инициализации во время этого события.

Все, что противоречит вышеизложенному, является плохой идеей.

Теперь... как это сделать лучше

  1. Для всего, что вы найдете в настройках, используйте AppSettings или файлы настроек.
  2. Использование статических конструкторов для инициализации приложения - плохая идея. Создайте статический класс со статическими методами, такими как Initialize() , Start() ... Позвони им в Application_Start событие глобального класса приложений.
  3. Статические классы со статическими полями и данными в многопоточной среде, такой как ASP.NET, являются большим провалом. Более чем один поток может сразу инициализировать ваше приложение. Как ваш код управляет этой ситуацией?,
  4. Забудьте о концепции глобальных переменных в объектно-ориентированном программном обеспечении. Используйте настройки (как я сказал в 1-й точке) или создайте константы или поля (статические или экземпляры) как часть класса, который будет его использовать.

ОБНОВЛЕНИЕ И ПРИМЕЧАНИЕ. Я предлагаю эту статью MSDN о статических конструкторах, чтобы понять, почему это плохая идея при инициализации ASP.NET.

Другие вопросы по тегам