ResourceProvider Factory定期刷新

时间:2009-02-04 07:27:02

标签: c# .net resourceproviderfactory

我已经创建了一个自定义资源提供程序,它从我们的数据库返回字符串以用于任何目的。

问题是我还没有找到一种方法来“破坏”这些项目的缓存并从数据库重新加载它们。理想情况下,我每隔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方法或其他方法可以轻松地为我提供所有这些对象?

1 个答案:

答案 0 :(得分:1)

如果可以使用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。