2012-08-04 42 views
5

这肯定是一个普遍的问题,但我找不到一个简单的方法来做到这一点。Asp.net页面生命周期特定的全局变量?

是否有一种方法可以在asp.net webform的生命周期中共享一个全局变量(比如实例化的代价昂贵的类),而不必将句柄传递给页面的每个组件?

如果我只是创建一个静态变量,它将被应用程序域中的所有线程访问(问题:我的类不是线程安全的),并且很难确保每个页面都可以在最近的副本上工作我想通过页面生命周期的每一步缓存该类,但每次调用新页面时我都需要一个新实例)。

另一种方法是通过页面中的每个控件传递句柄,但在母版页,页面本身和所有用户控件之间传递句柄,这会使代码变得非常多毛。

我想知道是否没有一个优雅的解决方案来存储一个类只能执行此特定页面(包括所有子用户控件)的线程访问的地方?

任何建议欢迎! 谢谢 Charles

回答

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 
+0

很好的解决方案!实际上,我可以有一个静态函数Foo.Current进入httpcontext,检查foo的实例是否已经存在,否则创建一个并添加它,并返回此实例。感谢您及时的回复! – Charles 2012-08-04 22:40:59

+0

只是因为别人可能会偶然发现这个答案......如果在变量集合方法中,你使用HttpContext.Current.Items [SOMEKEY] = value;那么如果不在那里,那么将创建一个项目,或者如果它已经在那里,则重置它的值。没有必要重新编码,当字典类已经为你做。 – AgapwIesu 2016-08-08 19:46:39