13

新しい.NET4.0キャッシング名前空間を利用しています:System.Runtime.Caching

現在、実際のアプリに最適なものを見つけるために、新しいAPIを試作品/いじっています。

これに沿って、基本的にキャッシュ内のすべて、特に次の情報をダンプするページ(ASP.NET MVC)を作成しようとしています。

  • キャッシュキー
  • キャッシュオブジェクト
  • キャッシュポリシー(有効期限など)
  • キャッシュの依存関係(ある場合)

ただし、キー/オブジェクト以外は取得できないようです。

これが私が現在遊んでいるコードです:

public ActionResult Index()
{
   var cache = MemoryCache.Default;

   // i can get the list of cache keys like this:
   var cacheKeys = cache.Select(kvp => kvp.Key).ToList();

   // i can also get a strongly-typed "CacheItem" like this:
   CacheItem item = cache.GetCacheItem("someKey");

}

「CacheItem」クラスが必要な情報(有効期限、依存関係など-少なくとも「ゲッター」として)を公開することを望んでいました。

しかし、そうではありません。キー、値、リージョン名のプロパティだけがあります。

キャッシュ内のアイテムを調べて、必要な情報を吐き出すにはどうすればよいですか?

欠落している名前空間/クラスはありますか?

編集

ChangeMonitorクラスがあるように見えますが、これも有効期限情報を提供せず、キャッシュアイテムが削除されたときにイベントをサブスクライブできるようにするだけです。

キャッシュ内のアイテムを取得する方法と、それらが期限切れになったときに取得する方法が必要です。

編集2

これが別の質問であるかどうかはわかりませんが、ObjectCacheにどのような存続期間を与えるべきかについても混乱しています。MSDNによると、これはシングルトンではなく、実際には複数のObjectCacheインスタンスを作成できます。それはどういう意味ですか、ObjectCacheインスタンスにアクセスするときに完全にロックされたシングルトンを使用する必要がありますか?

4

2 に答える 2

9

CacheItemPolicy がキャッシュ コレクションに追加された後、その CacheItemPolicy を取得する方法があるとは思えません。

これを回避する最善の方法は、ポリシー オブジェクトをキャッシュするアイテムと共にキャッシュすることですが、後でポリシーを取得できるように、キー名に "Policy" を追加するだけです。これは明らかに、最初にアイテムを実際にキャッシュに追加することを制御できることを前提としています。以下の例:

public ActionResult Index()
    {
        string key = "Hello";
        string value = "World";

        var cache = MemoryCache.Default;
        CacheItemPolicy policy = new CacheItemPolicy();
        policy.AbsoluteExpiration = DateTime.Now.AddDays(1);
        cache.Add(new CacheItem(key, value), policy);
        cache.Add(new CacheItem(key + "Policy", policy), null);

        CacheItem item = cache.GetCacheItem(key);
        CacheItem policyItem = cache.GetCacheItem(key + "Policy");
        CacheItemPolicy policy2 = policyItem.Value as CacheItemPolicy;

        ViewBag.Message = key + " " + value;

        return View();
    }
于 2011-02-09T19:51:44.523 に答える