实战 .Net 数据访问层 - 16

** 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 ** 技术进行传递!)

下一段: http://www.csdn.net/develop/Read_Article.asp?id=27560

Published At
Categories with Web编程
Tagged with
comments powered by Disqus