Global.asax.cs和静态变量

| 在WCF服务中,我需要创建一个可以随时随地访问的变量。我服务的所有方法都需要访问该数据,并且我只能加载一次。所以我虽然要在Global.asax.cs中使用静态变量。但是我不确定该变量的范围是什么。该数据是否将用于所有请求?我的理解是,应该这样,因为应在App Domain中使用相同的静态变量。那是对的吗?
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();
}
最后,有没有更好的方法来实现这一目标?我不是静态变量的忠实拥护者...     
已邀请:
您可以使用应用程序变量:
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,静态变量不在AppDomain之间共享。为了完成此任务,您可以看一下此示例。 您不希望使用全局变量,但是想要可以从任何地方和任何地方访问的东西,您看到矛盾了吗?任何一种单例都只是一个全局变量。 但是对于您来说,这似乎是最好的解决方案。您只应确保全局对象是不可变的且线程安全的。     
我将使用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;
        }
    }
}
最好在静态构造函数中进行初始化,因为这样调用将是线程安全的。     

要回复问题请先登录注册