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();
}
最后,有更好的方法来实现这一点吗?我不太喜欢静态变量。。。
您可以使用一个应用程序变量:
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;
}
}
}
事件最好是在静态构造函数中进行初始化,因为这样调用将是线程安全的。