English 中文(简体)
资源提供者工厂定期刷新
原标题:
  • 时间:2009-02-04 07:27:02
  •  标签:

我创建了一个自定义的资源提供程序,从我们的数据库返回字符串,以供使用。

问题是我还没有找到一种方法来“破坏”这些项目的缓存并从数据库重新加载它们。理想情况下,我会每 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方法或其他能让我轻松获取所有对象的方法,而无需编写全部代码?

问题回答

If you can use ASP.Net cache system Just use it. You can access it using HttpRuntime.Cache and add timed invalidation check the example below:

var Key = "Resources:" + ResourceType + ResourceKey + Cutlure.Name;
HttpRuntime.Cache.Insert(Key, ValueToCache,
    null, DateTime.Now.AddMinutes(1d), 
    System.Web.Caching.Cache.NoSlidingExpiration);

如果您无法使用ASP.Net缓存系统

You can put the logic that triggers cache invalidation inside of IResourceProvider. ie. just check in GetObject if the cache expired.





相关问题
热门标签