如何在asp.net中只创建一次类的实例

时间:2011-04-06 04:51:57

标签: c# asp.net

在aspx页面的partial类中创建一个类的实例。在page_load或按钮单击方法下我试图将值设置为类。但是当每次回发发生时,都会创建新实例并且我将丢失之前的值。

public partial class DatabaseSelection : System.Web.UI.Page
     {
        DBProperties dbpro;
        Metadata obmeta;      

    protected void Page_Load(object sender, EventArgs e)

        {
            if (!IsPostBack)
            {
               dbpro = new DBProperties();

            }  

4 个答案:

答案 0 :(得分:3)

如果您需要应用程序将此实例抛出应用程序或使用Singleton集合:

Application [“Foo”] = new MyClass(); 见其他答案。

如果您需要单个请求(这似乎不太可能):

HttpContext.Current.Items [“Foo”] = new MyClass();

如果您需要跨请求,则以下是所有选项,具体取决于您的方案:

  • 序列化为Cookie(将在每个请求上传输,因此如果管道存在问题,请不要使用此项)。适用于每个用户数据。
  • Store in Session:Session [“Foo”] = new MyClass(); //我个人不喜欢这个选项,因为随着用户群的增长,它会增加你的内存压力,但如果这个很小,那么这是一个不错的选择,因为它不会增加带宽消耗和性能。适合每用户存储。并且可以配置对DB或内存(以及其他)的持久性。
  • 存储在缓存中。根据您使用的密钥,好处是对生命周期的良好控制以及对每个用户是否具有一定的灵活性。
  • 以ViewState存储。在单个请求中很好,可扩展,但增加了有效负载。
  • 存储在隐藏的var中(与ViewState大致相同)

我不确定我会推荐Singleton模式。只要你的AppDomain有效地类似于Application变量,技术上单身就会坚持下去。

答案 1 :(得分:2)

您在寻找Singleton pattern吗?

答案 2 :(得分:1)

只需创建一个访问会话状态的方法,并尝试返回它,如果它已经存在的话。如果没有,它会创建它,将它存储在会话中,然后返回它。

答案 3 :(得分:1)

如果您希望对象在回发之间保留,则需要将其存储在会话/视图状态中,或者将其保存到数据库中。