@Hrvoje Hudoの回答を拡張しています...
コード:
using System;
using System.Runtime.Caching;
public class InMemoryCache : ICacheService
{
public TValue Get<TValue>(string cacheKey, int durationInMinutes, Func<TValue> getItemCallback) where TValue : class
{
TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
if (item == null)
{
item = getItemCallback();
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
}
return item;
}
public TValue Get<TValue, TId>(string cacheKeyFormat, TId id, int durationInMinutes, Func<TId, TValue> getItemCallback) where TValue : class
{
string cacheKey = string.Format(cacheKeyFormat, id);
TValue item = MemoryCache.Default.Get(cacheKey) as TValue;
if (item == null)
{
item = getItemCallback(id);
MemoryCache.Default.Add(cacheKey, item, DateTime.Now.AddMinutes(durationInMinutes));
}
return item;
}
}
interface ICacheService
{
TValue Get<TValue>(string cacheKey, Func<TValue> getItemCallback) where TValue : class;
TValue Get<TValue, TId>(string cacheKeyFormat, TId id, Func<TId, TValue> getItemCallback) where TValue : class;
}
例
単一アイテムのキャッシュ(各アイテムがそのIDに基づいてキャッシュされる場合、アイテムタイプのカタログ全体のキャッシュは非常に集中的になるため)。
Product product = cache.Get("product_{0}", productId, 10, productData.getProductById);
何かをすべてキャッシュする
IEnumerable<Categories> categories = cache.Get("categories", 20, categoryData.getCategories);
TIdを選ぶ理由
ほとんどのデータキーは複合ではないため、2番目のヘルパーは特に便利です。複合キーを頻繁に使用する場合は、追加のメソッドを追加できます。このようにして、あらゆる種類の文字列連結またはstring.Formatsを実行して、キーを取得してキャッシュヘルパーに渡すことを回避します。また、IDをラッパーメソッドに渡す必要がないため、データアクセスメソッドの受け渡しも簡単になります。大部分のユースケースでは、全体が非常に簡潔で一貫性のあるものになります。