我创建了一个自定义资源提供程序,该提供程序从数据库中返回字符串以用于任何用途。
问题是我还没有找到一种方法来“清除”这些项目的缓存并从数据库中重新加载它们。理想情况下,我会每隔x分钟执行一次此操作,或者在我们更新缓存并希望重新加载时手动进行。
从技术上讲,这很容易。我将所有内容存储在哈希表中,因此只需核对一下即可,并在需要时重新加载。但是,由于ResourceProviderFactory处理每个资源类的加载,因此我不确定如何枚举它创建的类。
代码概述:
public class ResourceProvider : IResourceProvider
{
private Dictionary<string, Dictionary<string, object>> _resourceCache
= new Dictionary<string, Dictionary<string, object>>();
private string _virtualPath;
private string _className;
public ResourceProvider(string virtualPath, string className)
{
_virtualPath = virtualPath;
_className = className;
}
public object GetObject(string resourceKey, CultureInfo culture)
{
...
}
}
public class ResourceProviderFactory :System.Web.Compilation.ResourceProviderFactory
{
public override IResourceProvider CreateGlobalResourceProvider(string classKey)
{
return new Cannla.Business.Resource.ResourceProvider(string.Empty, classKey);
}
...
...
}
我打算做的是每次调用CreateGlobalResourceProvider时都添加一个引用(例如,将新对象添加到集合中,然后枚举并在需要时枚举该对象中的所有内容),但是我不确定这是否会做ResourceProviderFactory有点奇怪。
在构建所有代码之前,是否有任何ResourceProviderFactory IEnumerable方法或某种可以轻松实现所有这些对象的方法?
最佳答案
如果可以使用ASP.Net缓存系统
只需使用它。您可以使用HttpRuntime.Cache访问它,并添加定时失效检查以下示例:
var Key = "Resources:" + ResourceType + ResourceKey + Cutlure.Name;
HttpRuntime.Cache.Insert(Key, ValueToCache,
null, DateTime.Now.AddMinutes(1d),
System.Web.Caching.Cache.NoSlidingExpiration);
如果无法使用ASP.Net缓存系统
您可以将触发缓存无效的逻辑放在IResourceProvider中。
即。只需在GetObject中检查缓存是否过期。
关于c# - ResourceProviderFactory定期刷新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/510396/