使用IsLine FrameWork开发ASP.NET程序之七—使用HttpContentProvider 访问缓存

    上一期我给大家介绍了异常的展示管理部分,用户可以使用预置渲染器也可以自定义渲染,今天我们来介绍 IsLine.HttpContent.HttpContentProvider命名空间,该命名空间主要封装了在B/S模式运行下的一些特性,开发人员可以使用它规范命名问题、获得统一规范的存取策略(比如cookie过期时间、ssl支持),并按照这样的策略进行开发,而这些策略是在web.config中配置的,如果后期需要修改策略,可以直接更新config文件,整站的存取就会随之发生变化。这样为站点变量的修改与控制提供了统一的入口,简化了修改流程,增加了程序的稳定性,同时也极大的降低了测试的成本。

    这个Provider主要封装了对缓存、Session与Cooike的操作,该空间下主要有三个类:CookieProvider、    SessionProvider、CacheProvider。这三个类库统一实现ICapability接口,ICapability继承自IBaseCapability接口,IBaseCapability规范了HttpContentProvider的基础能力,而ICapability则是对基础能力的扩展,如下:

namespace IsLine.HttpContent.HttpContentProvider
{
public interface IBaseCapability
{
bool Remove(string Name);
bool IsExit(string Name);
}
public interface ICapability : IBaseCapability
{
object GetContent(string Name);
bool UpdateContent(string Name, object value);
}
}

    可以看出,接口主要约束了如何删除、获得与更新一个对象,即约束了Session、Cookie、Cache的行为。在其他的Provider中,其实也有对本身能力与操作相关规范,这些规范被称作规约或约束,如果各位读者看过本系列文章的第一篇,就会有所了解关于IsLine FrameWork规约的介绍。

    给大家介绍的首先是有关Cache的操作,CacheProvider支持.Net两种类型的Cache:运行时Cache(HttpRuntime.Cache)与上下文Cache(HttpContext.Current.Cache),这两种Cache有什么区别呢?这里简单的解释一下:

     HttpRuntime.Cache是Application级别的,而HttpContext.Current.Cache是仅对当前WEB页面请求才有效的。换句话说,HttpRuntime Cache所有的web与非web程序都可以调用,而HttpContext则只能用在WEB中,这里向大家推荐使用HttpRuntime Cache。Cache实际上是内存片,在计算机经典理论中,这是一种以空间换时间的做法,目前虽然内存很便宜,但是如果不当的使用,依然会带来性能问题,因为.Net运行时环境是托管的,也就是说公共语言运行时CLR会管理.Net 代码的运行,如果这部分的内容过于庞大,同样会造成性能的下降,因为CLR不得不维护一个庞大的内存区域,垃圾回收机制也会频繁启动,这就使得正常运行的代码收到影响,这种情况是应当避免的。

    缓存中的数据是易失的,数据并不是在整个应用程序生命周期中都存储在内存中,由 ASP.NET 管理缓存,它会在项过期、无效、或内存不足时移除缓存中的项。还可以配置应用程序缓存,以便在移除项时通知应用程序。所以,你并不知道缓存在什么时候会失效,即使你已经配置了依赖项。

    关于缓存的过期有2种类型:滑动窗口与绝对过期。滑动窗口是指某项自上次被访问后多长时间过期;绝对过期指定某项在设定的时间过期,而不考虑访问频率。可以将缓存中某一项的生存期配置为依赖于其他应用程序元素,如某个文件或数据库。当缓存项依赖的元素更改时,ASP.NET 将从缓存中移除该项。

    CacheProvider类支持以下2种依赖:文件依赖项与SQL SERVER数据库依赖项。文件依赖只缓存中的项依赖于外部文件。如果该文件被修改或删除,则缓存项也会被移除;QL SERVER数据库依赖项只缓存中的项依赖于 Microsoft SQL Server 2005、SQL Server 2000 或 SQL Server 7.0 数据库中表的更改。对于 SQL Server 2005,缓存中的项可依赖于表中的某一行。

    以下是CacheProvider主要方法的介绍,其中包含重载项,重载项一并在以下列出:

    ● CacheProvider :构造函数,参数指明了需要操作的缓存名称

    ● Object GetContent:获得缓存中的内容,其中有如下几个参数, CacheType指明缓存类型,可以是运行时或上下文Cache,默认为运行时Cache;cacheName为需要操作的缓存名称;CacheDependencyType为依赖项类型,可以是sql或文件;depend为具体依赖项;depend为具体依赖项

    ● Bool UpdateContent:更新或新建缓存内容,参数指明了需要操作的缓存名称;使用无参的方法,系统将返回默认缓存的内容。

    ● bool Remove:移除缓存,参数指明了需要操作的缓存名称,并返回是否移除成功

    ● IsExit:判断缓存是否存在,参数指明了需要操作的缓存名称

    缓存依赖项可以以参数方式统一传入,这样方便了开发人员。SQL缓存只针对SQL SERVER数据库有效,指定使用文件缓存还是数据库缓存,可以通过CacheDependencyType参数达到目的,CacheDependencyType是一个枚举值,在IsLine.HttpContent.HCDataTypeEnum命名空间下,该命名空间内容为枚举类,规范了参数的传递,这四个枚举为DateType、CacheType、CacheDependencyType、RemoveType。其中DateType规范了滑动时间的类型包括日、月、年与分钟;CacheType规范了处理Cache的类型,包括运行时Cache与上下文Cache;CacheDependencyType规范了缓存依赖类型,包括SQL SERVER数据库依赖、文件依赖和None,None表示无依赖;RemoveType规范了移除选项的操作,该枚举会在对Cookie的操作中用到,其中的2个枚举值RemoveInput, RemoveAllExcludeInput分别表示移除传入的Cookie和移除除传入之外的Cookie。

    需要注意的是,即使使用CacheProvider(string cacheName)指明了需要操作的Cache,但是如果后面的代码中,实例调用的方法中包含其他Cache的名称,那么以后使用不带Cache名称参数的方法时,将会操作那个新的Cache,而忽略构造函数中指明的Cache。

    例如:

    CacheProvider cp = new CacheProvider(“A”);
    cp.GetContent(); //这一步将获得Cache“A”的内容
    cp.IsExit(“B”) //这一步检测Cache“B”是否存在
    cp.GetContent(); //这一步将获得Cache“B”的内容,而不是构造函数中的Cahce“A”

    Cache是.Net平台为大家提供的一个很好的机制,IsLine FrameWork对这个机制完美封装,为程序人员提供了规范的命名规则用于对它进行存取,并且简化了存取调用的难度,使使用过程更加简便。

    此文已在《软件报》同步发布,任何个人媒体不得转载。

posted on 2010-05-05 10:57  Aicken(李鸣)  阅读(1488)  评论(0编辑  收藏  举报