zoukankan      html  css  js  c++  java
  • 为 ASP.NET 创建缓存配置对象[转载]

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

    发布日期: 4/1/2004 | 更新日期: 4/1/2004

    Steven A. Smith

    ASPAlliance.com

    适用于:

    Microsoft ASP.NET

    摘要:了解 CacheConfig 帮助器类如何改善 ASP.NET 应用程序中的缓存策略,如何改善缓存数据的重用,以及如何大幅减少代码行数以实现使用最佳实践的缓存。本文建立在文档 ASP.NET Caching:Techniques and Best Pratices 的基础上。(7 页打印页)

    *

    下载 CacheConfigDemo.msi

    本页内容

    简介 简介
    配置 配置
    首次使用 首次使用
    基本方法:DeCache 基本方法:DeCache
    用法:为数据访问层添加缓存支持 用法:为数据访问层添加缓存支持
    小结 小结
    资源 资源

    简介

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

    配置

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

    代码示例 1. 配置节和键名

    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 配置节一样。必须把该新配置节定义在 web.config 中,如代码示例 2 所示。

    代码示例 2. web.config 中定义 CacheSettings 配置节

    <configSections> 
    <section name="CacheSettings"  
      type="System.Configuration.NameValueFileSectionHandler, System,  
      Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"  
      /> 
    </configSections> 
    

    <configSections> 元素必须是 web.config 配置元素中的第一个元素。

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

    代码示例 3. 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="30" /> 
    <!-- Cache Keys and Durations -  
    use "default" for value to use default otherwise integer. --> 
    <add key="AuthorsDataTable" value="default" /> 
    <add key="AuthorsDataTableByState" value="10" /> 
    </CacheSettings> 
    

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

    1. 配置设置和它们的效果

    设置 描述

    EnableCaching

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

    RequireKeyDefinitionInConfig

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

    DefaultCacheDurationUnits

    "seconds"、"minutes" 或 "hours"。为下一节指定的持续时间值定义单位。用作添加到缓存但没有指定时间段的项的默认缓存持续时间。

    DefaultCacheDurationValue

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

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

    首次使用

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

    将 CacheSettings 配置节加载到本地 NameValueCollection.

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

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

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

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

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

    基本方法:DeCache

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

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

    DeCacheDataTable() 方法支持几个重载:

    (string key, GetDataTableCallback  callback)

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

    (string key, GetDataTableCallback callback, object[]  callbackArguments)

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

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

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

    (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 以获取这些作者的数据访问类。数据访问类 Author.cs,使用 Microsoft 数据访问应用程序块最小化数据访问所需的代码量。在添加缓存支持之前,它包含两个方法:ListAuthors()ListAuthors(string state)。每个方法返回一个带有 Authors 表内容的 DataTable—后者用 state 列的值过滤。添加缓存支持之前的 ListAuthors() 方法如代码示例 4 所示。

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

    public static DataTable ListAuthors() 
    { 
       return SqlHelper.ExecuteDataset(ConnectionString,  
          CommandType.Text,  
          "SELECT * FROM Authors").Tables[0]; 
    } 
    

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

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

    protected static DataTable ListAuthors(object[] args) 
    { 
       return SqlHelper.ExecuteDataset(ConnectionString, 
          CommandType.Text, 
          "SELECT * FROM Authors").Tables[0]; 
    }
    

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

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

    public static DataTable ListAuthors() 
    { 
       GetDataTableCallback callback =  
    new GetDataTableCallback(Author.ListAuthors); 
       return CacheConfig.DeCacheDataTable("AuthorsDataTable",  
    callback, new SqlParameter[]{null}); 
    } 
    

    提供的示例代码包含了 ListAuthors() 的另一个重载,用于支持根据 state 筛选,它通过稍微更改 SQL 及使用发送给它的参数数组共享使用保护方法。

    小结

    通过在 ASP.NET 应用程序中引用 CacheConfig并用于所有它支持的缓存操作,您可以对缓存策略进行更多的控制,并对使用最佳实践技术引用缓存有更强的自信。尽管被限制为 DataTable 对象,并且 DataTable 对象在当前表单的到期时间是绝对的,但是通过使用任何希望定义的依赖项,CacheConfig类很容易进行扩展以封装任何其他类型的需要缓存的可序列化对象。

    资源

    ASP.NET Caching:Techniques and Best Practices

    关于作者

    Steven A. Smith,Microsoft ASP.NET MVP,是 ASPAlliance.com 的总裁和所有者。他还是 ASPSmith Ltd (一家专注于 .NET 的培训公司)的所有者和首席讲师。他著有两本书:ASP.NET Developer's Cookbook 和 ASP.NET By Example,还在 MSDN 和 AspNetPRO 杂志发表过文章。Steve 每年都要在一些会议上发表演讲,他是 INETA speaker's bureau 和 ASPInsiders 的成员。Steve 拥有企业管理硕士学位和计算机科学工程理学士学位。

    可发送电子邮件至 ssmith@aspalliance.com联系 Steve。

    转到原英文页面


     

  • 相关阅读:
    Facelets应用程序的生命周期
    JavaServer Faces生命周期概述
    spring security使用自定义登录界面后,不能返回到之前的请求界面的问题
    记一次使用mybatis进行like 模糊查询遇到的问题
    用Filter作用户授权的例子
    p132代码解析
    xml
    java EE第一周博客
    spring security的简单应用
    Java包装类,以及Integer与int之间的比较
  • 原文地址:https://www.cnblogs.com/king_astar/p/58193.html
Copyright © 2011-2022 走看看