在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();
}
最后,有没有更好的方法来实现这一目标?我不是静态变量的忠实粉丝......
答案 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;
}
}
}
事件更好的是静态构造函数中的初始化,因为那时调用将是线程安全的。