** 5. ** ** Cache Management **
首先说明一点,之所以将 Cache Management 单列出来,就
是为了要说明数据缓存的重要性!在很多时候,这比撰写 Data
Access Logic 更让人费心,也更令人难以把握。
作者的这个 Cache Management 实现了进行 Data Cache 时所
必须考虑的几个问题,虽然还并不完善,但也可在实战中运用了!
以下,就是它的结构示意图:
从图中,可以很明显地看到,这个 Cache Management 方案
主要由 ** 3 ** 部分组成: Manager Class , delegate declaration , Parameter
Classes !
Manager 是总控制台,所有的调用全部通过它来完成,对外
接口也尽可能地表现出一定的简洁性。同时,由于 Cache
Management 一般都在整个 Application Level 实现,所以,毫无
疑问的, CacheManager 又自动成为了一个 ** Singleton ** !
从上面的图中,我们不难发现, CacheManager 对外提供的真
正数据访问方法只有一个: ** GetCache ** (另一个是 Singleton 访问,
不算在内 J )!
Ok ,就让我们先来看看这个 GetCache 到底做了些什么处理:
代码 14 :探索 CacheManager 之 GetCache !
public delegate ** ArrayList ** ** GetArrayList ** ();
public class ** CacheManager **
{
// 用于确保 singleton 下 thread-safe 操作的 dummy object
private static object _currentLocker = new object ();
// 用于实现 Singleton 的 static object
private static ** CacheManager ** _current = null ;
// 用于存放 Windows Application 的 Cache Data
private ** Hashtable ** _htWinAppCache = null ;
public ** ArrayList ** GetCache( ** CacheParam ** param, ** GetArrayList ** del)
{
if (param == null )
return del();
else
{
if (IsCacheExpired(param.Name))
return ( ** ArrayList ** )UpdateCache(param, del());
else
return ( ** ArrayList ** )RetrieveCache(param.Name);
}
}
...
}
哇,原来是“骗人”的嘛!这所谓的“一个方法”居然不是返回 ** object ** 类型,还“振振有词”地作了一次强制类型转换!
没错,当前这个 DAF Solution 暂时只提供针对 ArrayList 的 Cache Management ,而且,如果需要扩展为其它类型,在提供重载版本的新 GetCache 方法之外,还必须提供相应的 delegate 声明!
但是,请您相信,作者如此安排纯粹是为了代码修改和编译起来更加方便(本文开头已经声明,可以通过 Visual Studio .NET 2003 编译支持 .NET Framework 1.2 的代码),觉无“欺骗”之意 J !
上文在讲述 Data Access Logic 时曾经提到 Anonymous Delegate ,这个新特性虽然只在 C# 2.0 中才被支持,但好歹有比较简单的变通方法可以确保您的代码在 C# 1.0 Compiler 中编译通过(请参考代码 11 后面的说明)。但是,如果作者一旦在 CacheManager 中使用 ** Generics ** (另一个只在 C# 2.0 才被支持的特性)来完全实现“只有一个 GetCache 方法”的 CacheManager , 反向调整 起来就非常麻烦(让其在 Visual Studio .NET 2003 中编译通过),所以,在这个版本中就采用了比较“土气”的方法 J ,这并不影响我们讨论 Cache Management 的实际功能(有兴趣的朋友可以自己去试着用 Generics 实现 CacheManager ,但别忘了 delegate 也必须以 Generic 的方式进行声明!另外, delegate 之 parameter list 可以通过声明“ ** object[] ” ** 的方式并结合 ** Reflection ** 技术进行传递!)