Global.asax.cs和静态变量

本文关键字:静态 变量 cs asax Global | 更新日期: 2023-09-27 17:57:56

在WCF服务中,我需要创建一个可以随时随地访问的变量。我的服务的所有方法都需要访问该数据,并且我只能加载一次。因此,我考虑在Global.asax.cs中使用一个静态变量。然而,我不确定该变量的作用域是什么。这些数据将用于所有请求吗?我的理解是应该这样做,因为在整个应用程序域中应该使用相同的静态变量。这是正确的吗?

public static IList<MyData> Data { get; set; } 
private static IList<MyData> Load() 
{
    return Big data struct from DB.
}
protected void Application_Start(object sender, EventArgs e)
{
    Data = Load();
}

最后,有更好的方法来实现这一点吗?我不太喜欢静态变量。。。

Global.asax.cs和静态变量

您可以使用一个应用程序变量:

public static IList<MyData> Data {
    get
    {
        if (Application["MyIListData"] != null)
            return (IList<MyData>)Application["MyIListData"];
        else
            return new IList<MyData>();
    }
    set
    {
        Application["MyIListData"] = value;    
    }
} 
protected void Application_Start(object sender, EventArgs e)
{
    Data = Load();
}

在实际实现中没有太大的不同,只是现在它可以作为应用程序变量通过变量名全局可用。

是的,静态变量在应用程序中的所有线程/会话中都是有效的/可见的。

AFAIK,静态变量不在AppDomains之间共享。为了完成这项任务,你可以看看这个例子。

你不想要一个全局变量,但你想要任何人和任何地方都可以访问的东西,你看到矛盾了吗?任何类型的singleton都只是一个全局变量。但在你的情况下,这似乎是最好的解决方案。您只需要确保您的全局对象是不可变的并且线程安全的。

我会使用Singleton模式来存储"应用程序范围"的变量。它是静态的,将在第一次使用后分配,并在应用程序的整个生命周期内可用。我还认为这比使用类似于非类型化HashTable的应用程序要好得多。对我来说,应用程序存储是ASP的残余,在面向对象的世界中不再有用。

请注意,静态变量只初始化一次,因为每个web请求/服务调用都在自己的线程中运行。

像这样,你可以在第一次使用时加载数据,并使用MyData从任何地方访问它。数据:

public class MyData
{
    private static IList<MyData> _data { get; set; } 
    public static IList<MyData> Data 
    {    
        get
        {
            if (_data == null)
               _data = load Big data struct from DB.
            return _data;
        }
    }
}

事件最好是在静态构造函数中进行初始化,因为这样调用将是线程安全的。