效能優化無過於「快取」。即便所謂「靜態頁」,本質也是整頁快取。但現代 Web 2.0 網站互動頻繁,粒度過大的快取幾乎不可用。例如 Twitter 名人發文,豈能重新生成數十萬用戶的靜態頁?我們需要更細緻的「視圖片段快取」。
ASP.NET WebForm 提供控制項級快取,但最小單元是「控制項」而非任意頁面區塊。筆者早年提出 CachePanel,包裹任意內容皆可快取,效果顯著。然而 MVC 視圖只是模板,無法使用伺服器控制項。
解決之道在於利用 WebForm 強大的視圖引擎,建立脫離後端代碼的「標記」方式。Rails、Django 皆有類似功能,ASP.NET MVC 2.0 尚未內建,我們自行擴充 HtmlHelper:
public static class CacheExtensions
{
public static string Cache(
this HtmlHelper htmlHelper,
string cacheKey,
CacheDependency cacheDependencies,
DateTime absoluteExpiration,
TimeSpan slidingExpiration,
Func<object> func)
{
var cache = htmlHelper.ViewContext.HttpContext.Cache;
var content = cache.Get(cacheKey) as string;
if (content == null)
{
content = func().ToString();
cache.Insert(cacheKey, content, cacheDependencies, absoluteExpiration, slidingExpiration);
}
return content;
}
}
這是起點,後續將演進為支援標記語法、捕獲輸出流的完整方案。