2012-06-10 2 views
0

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

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. Мне нужен этот класс для инициализации только один раз, поскольку он содержит глобальные переменные, которые я не хочу отзывать каждый запрос браузера.

Благодаря

+2

добавьте трассировку стека и код, который вы получите это исключение, в – eyossi

+0

Если вы думаете, что TruePath или BasePath могут быть нулевыми значениями, которые вы ищете. – Grumsh

+0

Вещь в том, что это происходит время от времени. Если я сброшу свой компьютер и запустим проект, он может работать нормально. Это случается раз в то время, поэтому воссоздание исключения может занять некоторое время. – Novak

ответ

2

Прежде всего, я хочу предложить вам глобальную концепцию VARS в объектно-ориентированном коде является плохой идеей.

Для того, чтобы решить проблему, необходимо использовать встроенный, обработчик вне коробки ASP.NET approaches: global application class.

Использование Application_Start событий и вызывать процессы инициализации во время этого события.

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

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

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

UPDATE & Примечание Я предлагаю это MSDN article о статических конструкторах для того, чтобы понять, почему это плохая идея в инициализации ASP.NET.

+0

Спасибо, что помогли, теперь я начну его строить. Опять же, большое спасибо! – Novak

+0

@GuyDavid Нет проблем! Надеюсь, ты нашел правильный путь! –

+0

Почему нисходящий? –