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。我需要这个类只初始化一次,因为它包含全局变量,我不想在每个浏览器请求中都调用它们。

谢谢

4

1 回答 1

2

首先,我想建议您在面向对象的代码中使用全局变量概念是一个坏主意。

为了解决您的问题,您需要使用内置的、开箱即用的ASP.NET 方法:全局应用程序类

在此事件期间使用Application_Start事件处理程序并调用初始化过程。

任何反对上述陈述的都是一个坏主意。

现在......如何做得更好

  1. 对于您发现的所有设置,请使用AppSettings设置文件
  2. 使用静态构造函数进行应用程序初始化是一个坏主意。使用静态方法创建一个静态类,Initialize()Start()例如...。Application_Start在全局应用程序类的事件中调用它们。
  3. 在像 ASP.NET 这样的多线程环境中具有静态字段和数据的静态类是一个很大的失败。不止一个线程可以一次初始化您的应用程序。您的代码如何管理这种情况?.
  4. 在面向对象的软件中忘记全局变量的概念。使用设置(就像我在第一点说的)或创建常量或字段(静态或实例)作为将要使用它的类的一部分。

更新和注意 我建议这篇关于静态构造函数的MSDN 文章,以了解为什么这些在 ASP.NET 初始化中是一个坏主意。

于 2012-06-10T19:11:01.693 回答