如何解决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;
}
}
}
最好在静态构造函数中进行初始化,因为这样调用将是线程安全的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。