如何在ASP.NET Cache中存储类实例(帮助器类)?

时间:2010-06-30 16:20:15

标签: c# asp.net .net-3.5 caching asp.net-3.5

我有一个使用Activator.CreateInstance()方法创建的类实例。该类实例包含在整个应用程序中经常使用的辅助方法。为了避免多次创建实例,我只是考虑实现适当的缓存机制。

应考虑以下因素:

1)我不能使用静态类和方法。

2)每个App Domain大约有6个实例(每个类1个实例)。

您的建议将不胜感激!

4 个答案:

答案 0 :(得分:2)

如果要避免多次创建,请不要使用ASP.Net缓存对象。缓存对象特别不保证您放入的任何内容都将保留在那里。事实上,如果服务器需要释放资源,它是首先被拆分的东西之一。

更好的选择是使用HttpApplicationState对象,该对象应该用于存储所有会话都需要全局访问的对象。如果您正确访问它,它还具有内置的线程安全性。

执行此操作的代码如下:

HttpContext.Current.Application.Lock();
HttpContext.Current.Application["myObject"] = myObject;
HttpContext.Current.Application.Unlock();

利用它只是

var myObject = (MyObject)HttpContext.Current.Application["myObject"];

答案 1 :(得分:1)

使用singleton模式:

class MySingleton {

     private static MySingleton instance;

     public MySingleton {
          if(instance != null)
              // One already created, the only call to this
              // should come through Activator
              throw...
          instance = this;
     }

     public static MySingleton GetInstance() {
          if(instance == null) instance = new MySingleton();
          return instance;
     }

}

激活器使用公共构造函数。然后,您仍然可以通过GetInstance()检索实例。

答案 2 :(得分:0)

广告1)您的实例的静态容器怎么样?沿着单身模式的路线?

Ad 2)6个单身或一个静态通用单身人士类。

P.S。:我想静态限制仅适用于辅助类本身?

P.P.S。:使用HttpContext.Current.Application几乎是相同的方法,除了速度较慢。

答案 3 :(得分:0)

听起来像依赖注入容器的情况。无论你选择哪一个,它们都支持像单例一样的缓存,它将为你做Activator.CreateInstance部分。

我喜欢NInject,因为它很简单。