3

データベースから文字列を返し、何にでも使用できるカスタム リソース プロバイダーを作成しました。

問題は、これらのアイテムのキャッシュを「破棄」してデータベースから再ロードする方法が見つからないことです。理想的には、これを 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 メソッドまたはこれらすべてのオブジェクトを簡単な方法で提供するものはありますか?

4

1 に答える 1

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 をチェックインしてください。

于 2009-10-08T14:52:15.397 に答える