2009-02-04 68 views
3

我創建了一個自定義的資源提供程序,它從我們的數據庫返回字符串以用於任何情況。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

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

+0

這不是時間問題,我正在尋找如何獲得每個創建的對象的引用。不過謝謝你的想法。 – mjallday 2009-10-12 09:27:48