微軟 Patterns & Practices 團隊產出的 Enterprise Library 組件最終納入 .NET Framework 核心,System.Runtime.Caching 不僅是快取庫,更是快取抽象框架。核心抽象類別 ObjectCache 定義通用操作(Get/Set/Remove/Contains),內建 MemoryCache 為預設記憶體實作,開發者可繼承 ObjectCache 整合 Redis、Memcached 或自訂儲存後端。
傳統快取依賴輪詢或硬編碼失效邏輯,ChangeMonitor 提供事件驅動的相依性聲明:
var cache = MemoryCache.Default;
var policy = new CacheItemPolicy();
// 檔案相依性:設定檔異動即失效
policy.ChangeMonitors.Add(new HostFileChangeMonitor(new[] { "config.json" }));
// SQL 相依性:資料表異動即失效 (需啟用 Service Broker)
policy.ChangeMonitors.Add(new SqlChangeMonitor("SELECT Col FROM dbo.Table"));
cache.Set("Key", data, policy);
框架要求繼承 ChangeMonitor 並正確實作:
UniqueId:唯一識別碼Dispose():釋放監聽資源OnChanged(null) 通知快取失效文件詳盡規範了生命週期與執行緒安全要求,降低自訂實作風險。
public T GetOrAdd<T>(string key, Func<T> factory,
IEnumerable<ChangeMonitor> monitors = null,
TimeSpan? slidingExpiration = null)
{
var cache = MemoryCache.Default;
if (cache.Contains(key)) return (T)cache.Get(key);
var policy = new CacheItemPolicy();
if (slidingExpiration.HasValue)
policy.SlidingExpiration = slidingExpiration.Value;
if (monitors != null)
foreach (var m in monitors) policy.ChangeMonitors.Add(m);
var value = factory();
cache.Set(key, value, policy);
return value;
}
Cache 物件仍可使用,但新專案優先採用 MemoryCacheObjectCache 介面對接 Redis/NCacheChangeMonitor 替代手工快取清除邏輯