Global.asax.cs和Static变量

时间:2011-05-26 16:58:41

标签: c# asp.net asp.net-4.0 global-asax

在WCF服务中,我需要创建一个应该可以随时随地访问的变量。我的服务的所有方法都需要访问该数据,我只能加载一次。所以我想在Global.asax.cs中使用静态变量。但是我不确定该变量的范围是什么。该数据是否将用于所有请求?我的理解是它应该是因为应该在App域中使用相同的静态变量。这是对的吗?

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();
}

最后,有没有更好的方法来实现这一目标?我不是静态变量的忠实粉丝......

3 个答案:

答案 0 :(得分:5)

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

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();
}

在实际实现中没有太大的不同,除了现在通过该变量名称作为应用程序变量全局可用。

答案 1 :(得分:0)

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

AFAIK, AppDomains 之间不共享静态变量。要完成此任务,您可以查看at this example

您不需要全局变量,但是您想要从任何人和任何地方都可以访问的内容,您会看到矛盾吗?任何类型的单例都只是一个全局变量。 但在你的情况下,它似乎是最好的解决方案。您应该确保您的全局对象不可变线程安全

答案 2 :(得分:0)

我会使用Singleton模式来存储“应用程序范围”变量。它是静态的,将在第一次使用后分配,并在应用程序的生命周期内可用。我也认为这比使用像Application这样的无类型HashTable要好得多。对我来说,应用程序存储是ASP的一种遗留,在面向对象的世界中不再有用。

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

像这样,您可以在第一次使用时加载数据,并使用MyData.Data:

从任何地方访问它
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;
        }
    }
}

事件更好的是静态构造函数中的初始化,因为那时调用将是线程安全的。