ASP.NET MVC での独自のカスタム出力キャッシュの作成に関する私のブログ投稿を確認してくださいhttp://bstavroulakis.com/blog/web/custom-output-caching-in-asp-net-mvc/
満たされていない出力キャッシュからの次の期待がありました
1) 必要に応じてキャッシング オブジェクトを表示し、必要に応じてそのすべての子を無効にしてパーツを無効にすることができます。
2) 必要に応じてキャッシュを無効にする機能があります。
3) アイテムがキャッシュされる前後に何らかのロジックを用意します。
4) サイトの一部を動的にして、それらの部分のみをロードし、サイトの残りの部分を静的にする
5) サイトの他の部分でもキャッシュ構造を使用します。
私の行動:
- キャッシュ内のオブジェクトを追加/削除/検索/... する独自の CacheManager を作成するには。
パブリック クラス CacheManager
{
#region ICacheManager メンバー
public static void Add(string key, object value, int expireSeconds)
{
if (expireSeconds == CacheManagerKey.CacheLifeSpanForever)
WebCache.Add(キー、値、null、System.Web.Caching.Cache.NoAbsoluteExpiration、System.Web.Caching.Cache.NoSlidingExpiration、CacheItemPriority.Normal、null);
そうしないと
WebCache.Add(キー、値、null、DateTime.MaxValue、TimeSpan.FromSeconds(expireSeconds)、CacheItemPriority.Normal、null);
}
public static bool Contains(文字列キー)
{
return WebCache.Get(キー) != null;
}
public static int Count()
{
WebCache.Count を返します。
}
public static void Insert(文字列キー、オブジェクト値)
{
WebCache.Insert(キー、値);
}
public static T Get (文字列キー)
{
return (T)WebCache.Get(キー);
}
public static List GetCacheKeys()
{
リストキー = new List();
foreach (HttpContext.Current.Cache の DictionaryEntry エントリ) keys.Add(entry.Key.ToString());
キーを返します。
}
public static void Remove(文字列キー)
{
WebCache.Remove(キー);
}
public static void RemoveAll()
{
リスト キー = GetCacheKeys();
foreach (キーの文字列キー)
WebCache.Remove(キー);
}
公開オブジェクト this[文字列キー]
{
得る
{
return WebCache[キー];
}
設定
{
WebCache[キー] = 値;
}
}
#endregion
public static System.Web.Caching.Cache WebCache
{
得る
{
System.Web.Caching.Cache キャッシュ = null;
if (HttpContext.Current != null)
キャッシュ = HttpContext.Current.Cache;
もし (キャッシュ == null)
キャッシュ = HttpRuntime.Cache;
キャッシュを返します。
}
}
}
[AttributeUsage(AttributeTargets.All, Inherited = true, AllowMultiple = false)]
パブリック クラス WebCacheAttribute : ActionFilterAttribute
{
public int 期間 { get; 設定; }
公開文字列 CacheKey { get; 設定; }
public Dictionary CacheParams {get; 設定; }
public Type CacheReturnType { get; 設定; }
パブリック文字列 ContentType { get; 設定; }
public HeaderContentTypeEnum ResponseHeaderContentType{get;set;}
公開文字列 CacheObj { get; 設定; }
プライベート読み取り専用 ICacheHoleFiller _cacheHoleFiller;
public WebCacheAttribute(int 期間、文字列 cacheKey、文字列 cacheParamsStr、HeaderContentTypeEnum 応答 = HeaderContentTypeEnum.Html、タイプ タイプ = null)
{
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
}
public T GetCachedParam(辞書パラメーター、bool isAjaxRequest)
{
}
公開文字列 GetUniqueKey(bool isAjaxRequest)
{
}
public void OnException(ExceptionContext filterContext)
{
}
プライベート HtmlTextWriter tw;
プライベート StringWriter sw;
プライベート StringBuilder sb;
プライベート HttpWriter 出力。
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
}
public override void OnResultExecuted(ResultExecutedContext filterContext)
{
}
}
var articleStr = CacheHelper.InvokeCacheMethod(typeof(HtmlHelperExtensions), "RenderArticlesCallback", new object[] { (int)articleType });
[WebCacheAttribute(CacheManagerKey.CacheLifeSpanForever, CacheManagerKey.Page_Article_Key, "articleTypeID")]
public static string RenderArticlesCallback(int articleTypeID)
{
public static class CacheHelper
{
パブリック デリゲート オブジェクト SourceDataDelegate(object[] args);
public static T InvokeCacheMethod(Type type, string methodName, object[] args)
{
return (T)InvokeCacheMethod(type, methodName, null, args);
}
public static T InvokeCacheMethod(Type type, string methodName, object instance, object[] args)
{
var メソッド = type.GetMethod(メソッド名);
var webCache = method.ReturnParameter.Member.GetCustomAttributes(typeof(WebCacheAttribute), true).FirstOrDefault();
ディクショナリ cacheParameters = FixCacheParameters(メソッド、引数);
T cachedObj;
if (Config.CacheEnabled && webCache != null)
{
cachedObj = ((WebCacheAttribute)webCache).GetCachedParam(cacheParameters, false);
if (cachedObj != null)
cachedObj を返します。
}
T returnObj = (T)method.Invoke(instance, args);
SaveCachedData(webCache, returnObj);
returnObj を返します。
}
public static void SaveCachedData(オブジェクト webCache、オブジェクト returnObj)
{
if (Config.CacheEnabled && webCache != null)
{
var fullParamString = ((WebCacheAttribute)webCache).GetUniqueKey(false);
CacheManager.Add(fullParamString, returnObj, ((WebCacheAttribute)webCache).Duration);
}
}
public static Dictionary FixCacheParameters(MethodInfo method, object[] args)
{
Dictionary cacheParameters = new Dictionary();
if (args != null)
{
var 引数 = args.ToList();
変数カウント = 0;
var argsCount = args.Length;
var methodParameters = method.GetParameters().ToList();
foreach (args の var 引数)
{
var key = methodParameters[カウント].Name;
オブジェクト値 = null;
if (argsCount > カウント)
値 = args[カウント];
if (値 != null && value.GetType() == typeof(string))
値 = (オブジェクト)value.ToString();
if (値 != null)
cacheParameters.Add(キー、値);
カウント++;
}
}
cacheParameters を返します。
}
}
このすべての詳細については、私のブログ投稿をご覧ください => ASP.NET MVC でのカスタム出力キャッシュ