当然这肯定是一个常见的问题,但我找不到一个简单的方法来做到这一点。
有没有办法在asp.net webform的生命周期中共享一个全局变量(比如一个实例化成本很高的类),而不必将句柄传递给页面的每个组件?
如果我只是创建一个静态变量,app域中的所有线程都可以访问它(问题:我的类不是线程安全的),并且很难确保每个页面都在最近的副本上运行(I想要通过页面生命周期的每一步缓存类,但每次调用新页面时我都想要一个新实例。
另一种方法是通过页面中的每个控件传递句柄,但是在母版页,页面本身和所有用户控件之间,它会使代码非常毛茸茸。
我想知道是否没有一个优雅的解决方案来在某个地方存储一个类,只有执行这个特定页面的线程(包括所有子用户控件)才能访问它?
欢迎任何建议! 谢谢 查尔斯
答案 0 :(得分:7)
有一个简单的答案:Items容器。它在单个请求的生命周期内可用,然后自动销毁。您可以将其包装在属性中以获得所需内容:
public class Foo {
const string SOMEKEY = "_somekey";
public static string SingleRequestVariable
{
get
{
return (string)HttpContext.Current.Items[SOMEKEY];
}
set
{
HttpContext.Current.Items.Add( SOMEKEY, value );
}
}
}
然后
Foo.SingleRequestVariable = "bar"; // somewhere
...
string val = Foo.SingleRequestVariable; // yet somewhere else