asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

为 ASP.NET 创建缓存配置对象


发布日期:2022年11月30日
 
为 ASP.NET 创建缓存配置对象

简介

如果您还没有阅读过 ASPNET Caching:Techniques and Best Practices请阅读本文主要以该文章的内容为基础尤其是最佳实践本文将描述 CacheConfig 类的内部组成该帮助器类为 Microsoft ASPNET 中的 Cache 对象提供包装该类公开了一个非常简单的方法用于完成 ASPNET 应用程序内的大部分公共缓存工作使用 CacheConfig类可以通过翻转配置设置启用或禁用缓存通过配置设置管理所有缓存项和其缓存持续时间也可以只用一行代码使用前面文章中描述的最佳实践技术来访问缓存

配置

CacheConfig 从 nfig 文件读取其所有配置设置指定的节和该节内的每个键值都使用缺省值定义为静态字符串如代码示例 所示

代码示例 配置节和键名

protected static string cacheSettingsConfigName = CacheSettings;

protected static string EnableCachingKey = EnableCaching;

protected static string RequireKeyDefinitionInConfigKey =

RequireKeyDefinitionInConfig;

protected static string DefaultCacheDurationUnitsKey =

DefaultCacheDurationUnits;

protected static string DefaultCacheDurationValueKey =

DefaultCacheDurationValue;

默认情况下所有 CacheConfig 配置设置都存储在名为 CacheSettings 的自定义配置节中该节被定义为简单的 NameValueCollection就像内置的 AppSettings 配置节一样必须把该新配置节定义在 nfig 中如代码示例 所示

代码示例 在 nfig 中定义 CacheSettings 配置节

<configSections>

<section name=CacheSettings

type=SystemConfigurationNameValueFileSectionHandler System

Version= Culture=neutral PublicKeyToken=bace

/>

</configSections>

<configSections> 元素必须是 nfig 配置元素中的第一个元素

一旦该节在 nfig 中定义并添加适当的键它将在应用程序中管理 CacheConfig 类的行为代码示例 显示了示例 CacheSettings 节

代码示例 CacheSettings 键和值

<CacheSettings>

<! true/false >

<add key=EnableCaching value=true />

<! true/false >

<add key=RequireKeyDefinitionInConfig value=true />

<! seconds minutes or hours >

<add key=DefaultCacheDurationUnits value=seconds />

<! integer >

<add key=DefaultCacheDurationValue value= />

<! Cache Keys and Durations

use default for value to use default otherwise integer >

<add key=AuthorsDataTable value=default />

<add key=AuthorsDataTableByState value= />

</CacheSettings>

前四个键对 CacheConfig 的行为影响最大最后几个键定义了所有对象的缓存键名和缓存持续时间这些对象存储在使用 CacheConfig 的缓存中 描述了前几个配置值的效果

配置设置和它们的效果

设置 描述

EnableCaching

True/False当它为 false 时 CacheConfig 被有效禁用不会向缓存写项或从缓存读项

RequireKeyDefinitionInConfig

True/False当它为 true 时如果为 CacheConfig 提供了一个键但在 nfig 中没有该键将引发异常

DefaultCacheDurationUnits

secondsminuteshours为下一节指定的持续时间值定义单位用作添加到缓存但没有指定时间段的项的默认缓存持续时间

DefaultCacheDurationValue

(整数)指定一个项应该在缓存中存储的时间长度使用 DefaultCacheDurationUnits 中定义的单位用作添加到缓存但没有指定时间段的项的默认缓存持续时间

由于这只是 CacheConfig 类的 所以非常简单未来的增强功能可能添加对其他类型关键依赖项的支持例如文件就像存储当前设置一样在配置中存储文件路径大部分缓存都缓存来自 Microsoft SQL Server? 的数据所以基于时间的缓存就足够了(至少到 ASPNET 的缓存 API 可使用 SQL 表缓存无效的内置支持时为止)

首次使用

CacheConfig 是个完全静态(在 Microsoft Visual Basic 中是共享的)的类这意味着它永远不能直接实例化但是它的方法可以直接使用然而它确实有一个构造函数每当第一次调用它的某种方法时调用该构造函数该静态构造函数执行如下任务

将 CacheSettings 配置节加载到本地 NameValueCollection

根据配置设置对本地 EnableCaching 变量进行设置

根据配置设置对本地 RequireKeyDefinition 变量进行设置

根据配置设置对本地 DefaultCacheDuration TimeSpan 进行设置

检查 HttpContext(缓存所需)是否可用如果不可用就把 EnableCaching 设置为 false(在设计时或者从 windows 窗体应用程序调用数据访问层时避免错误)

当第一次引用 CacheConfig 时静态构造函数只调用一次但是因为所有设置都存储在 nfig 中所以任何更新都将导致应用程序完全重启这当然意味着下次调用 CacheConfig 将再次运行静态构造函数并检索最新的值

基本方法DeCache

我调用的唯一方法是 DeCacheDeCache为给定的键从缓存请求出一个值如果缓存中不存在该值DeCache将使用作为回调函数提供的方法重新填充缓存并返回该方法的结果CacheConfig 还可以用于使用 EnCache()方法简单地向缓存添加一个项但几乎很少使用这个功能

对于每个要缓存的数据类型都必须有一个单独的 DeCache 方法本文提供的 CacheConfig 版仅支持 DataTable 对象这可以很容易地进行扩展以包含其他的对象包括 SystemObject(如果期望最终的灵活性超越强类型检查)但这样做需要许多重复代码一旦 C# 支持通用性就可以避免许多这种重复代码希望能产生该工具的新版本

DeCacheDataTable() 方法支持几个重载

(string key GetDataTableCallbackcallback)

— 当缓存需要为空时至少需要一个键和一个委托来填充缓存

(string key GetDataTableCallback callback object[]callbackArguments)

—包含回调方法的参数数组

(string key GetDataTableCallback callback object[]callbackArguments TimeSpan cacheDuration)

—包含一个持续时间它将重写在 nfig 中为该键指定的任何信息

(string key GetDataTableCallback callback object[]callbackArguments TimeSpan cacheDuration bool IgnoreCache)

IgnoreCache

—如果不存在将被视为 false把它设置为 true 将强制跳过缓存并从原始来源请求值

GetDataTableCallback 委托定义为

public delegate DataTable GetDataTableCallback(object[] args);

因为大部分情况下用于从数据源请求数据的现有方法不使用 (object[] args) 的签名所以通常的做法是使用该签名创建一个新的私有或保护方法并从现有方法调用它这种用法的示例如下所示

用法为数据访问层添加缓存支持

可下载的示例应用程序包含一个非常简单的 web 应用程序该应用程序有一个用于列举 Pubs 数据库中作者的 Web 窗体和一个用于查询 Pubs 以获取这些作者的数据访问类数据访问类 Authorcs使用 Microsoft 数据访问应用程序块最小化数据访问所需的代码量在添加缓存支持之前它包含两个方法ListAuthors() 和 ListAuthors(string state)每个方法返回一个带有 Authors 表内容的 DataTable—后者用 state 列的值过滤添加缓存支持之前的 ListAuthors() 方法如代码示例 所示

代码示例 没有缓存支持的简单数据访问方法

public static DataTable ListAuthors()

{

return SqlHelperExecuteDataset(ConnectionString

CommandTypeText

SELECT * FROM Authors)Tables[];

}

使用 CacheConfig 为该方法添加缓存支持必须首先创建一个匹配 GetDataTableCalllback 委托签名的新重载这意味着必须返回一个 DataTable 并接受一个对象数组作为它唯一的参数我们将把实际数据访问代码移动到这个新方法中如代码示例 所示

代码示例 把实际数据访问代码移动到匹配委托的方法中

protected static DataTable ListAuthors(object[] args)

{

return SqlHelperExecuteDataset(ConnectionString

CommandTypeText

SELECT * FROM Authors)Tables[];

}

创建新方法后更改原始方法以使用 CacheConfigDeCache() 方法并向它发送一个引用新 ListAuthors(object[]) 方法的回调函数代码示例 显示了 ListAuthors() 的新版本

代码示例 ListAuthors()现在修改为包含缓存支持

public sta               

上一篇:体验ASP.NET 2.0中的BuildProvider

下一篇:ASP.NET构造XML Web服务