我有一个使用Activator.CreateInstance()
方法创建的类实例。该类实例包含在整个应用程序中经常使用的辅助方法。为了避免多次创建实例,我只是考虑实现适当的缓存机制。
应考虑以下因素:
1)我不能使用静态类和方法。
2)每个App Domain大约有6个实例(每个类1个实例)。
您的建议将不胜感激!
答案 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,因为它很简单。