当前位置导航:炫浪网>>网络学院>>网页制作>>ASP.NET教程

企业库缓存依赖的实现-基于文件依赖

  最近在做项目的时候,采用用Codesmith和Nettiers生成的框架来实现,生成的代码核心是基于企业库的。所以最近在恶补企业库,对于缓存的学习当然是必不可少的,尤其是经常要用到得缓存依赖,这里我用到的是文件依赖来举例子,其他的都大同小异,主要就是要实现ICacheItemExpiration中的返回值类型为bool类型的HasExpired方法,来控制到期与否,实现此方法是关键所在。下面是程序清单,欢迎大家指正:

  step1 实现缓存到期接口,此类就为缓存项依赖的类,为缓存依赖的核心,尤其是其中HasExpired方法的定义,此类的核心就是使用lastCount是否变化来判断缓存是否到期;如果有变化则HasExpired方法返回true,否则返回false。

  Codeusing System;

  using System.Web;

  using Microsoft.Practices.EnterpriseLibrary.Caching;

  /// <summary>

  ///CacheItemDependency 的摘要说明

  /// </summary>public class CacheItemDependency : ICacheItemExpiration

  {

  //依赖缓存项键 private readonly string dependencyCacheKey;

  //依赖缓存项值 private System.Int32 lastCount; #region Constructor /// <summary>

  /// 初始化依赖缓存项,如果此缓存管理对象存在,则取出缓存的数据;若不存在,就要对此缓存管理赋值

  /// </summary>

  /// <param name="cacheKey">依赖缓存项的键</param>

  public CacheItemDependency(string cacheKey)

  {

  dependencyCacheKey = cacheKey; ICacheManager cacheManager = CacheFactory.GetCacheManager();

  lastCount = Int32.MinValue;

  if (cacheManager != null)

  {

  if (cacheManager.Contains(cacheKey))

  {

  object o = cacheManager.GetData(cacheKey);

  if (o != null)

  {

  this.lastCount = (int)o;

  }

  lastCount = (int)cacheManager.GetData(cacheKey);

  }

  else

  {

  cacheManager.Add(cacheKey, lastCount);

  }

  }

  }

  #endregion #region Properties public string DependencyCacheKey

  {

  get

  {

  return dependencyCacheKey;

  }

  }

  public System.Int32 LastCount

  {

  get

  { r

  eturn lastCount;

  }

  }

  #endregion #region ICacheItemExpiration Members public bool HasExpired()

  {

  ICacheManager cacheManager = CacheFactory.GetCacheManager();

  if (cacheManager == null)

  {

  return true;

  }

  System.Int32 currentCount = (int)cacheManager.GetData(dependencyCacheKey);

  if (currentCount != lastCount)

  { return true; }

  else

  {

  return false;

  }

  }

  public void Notify()

  { }

  public void Initialize(CacheItem owningCacheItem) { }

  #endregion}

  using System;

  using System.Web;

  using Microsoft.Practices.EnterpriseLibrary.Caching;

  ///

  ///CacheItemDependency 的摘要说明

  ///

  public class CacheItemDependency : ICacheItemExpiration

  {

  //依赖缓存项键

  private readonly string dependencyCacheKey;

  //依赖缓存项值

  private System.Int32 lastCount;

  #region Constructor

  ///

  /// 初始化依赖缓存项,如果此缓存管理对象存在,则取出缓存的数据;若不存在,就要对此缓存管理赋值

  ///

  /// 依赖缓存项的键

  public CacheItemDependency(string cacheKey)

  {

  dependencyCacheKey = cacheKey;

  ICacheManager cacheManager = CacheFactory.GetCacheManager();

  lastCount = Int32.MinValue;

  if (cacheManager != null)

  {

  if (cacheManager.Contains(cacheKey))

  {

  object o = cacheManager.GetData(cacheKey);

  if (o != null)

  {

  this.lastCount = (int)o;

  }

  lastCount = (int)cacheManager.GetData(cacheKey);

  }

  else

  {

  cacheManager.Add(cacheKey, lastCount);

  }

  }

  }

  #endregion

  #region Properties

  public string DependencyCacheKey

  {

  get { return dependencyCacheKey; }

  }

  public System.Int32 LastCount

  {

  get { return lastCount; }

  }

  #endregion

  #region ICacheItemExpiration Members

  public bool HasExpired()

  {

  ICacheManager cacheManager = CacheFactory.GetCacheManager();

  if (cacheManager == null)

  {

  return true;

  }

  System.Int32 currentCount = (int)cacheManager.GetData(dependencyCacheKey);

  if (currentCount != lastCount)

  {

  return true;

  }

  else

  {

  return false;

  }

  }

  public void Notify()

  {

  }

  public void Initialize(CacheItem owningCacheItem)

  {

  }

  #endregion

  }

  step2  定义修改依赖项缓存的方法

  Codeusing System;using System.Web;using Microsoft.Practices.EnterpriseLibrary.Caching;

  /// <summary>///DataAccessUtil 的摘要说明

  /// </summary>public class DataAccessUtil

  {

  public DataAccessUtil()

  { // //TODO: 在此处添加构造函数逻辑 //

  }

  /// <summary> /// 更新所有以cacheKeys中元素为key的缓存项

  /// </summary> /// <param name="cacheKeys">缓存项的key的数组

  </param> public static void UpdateCacheDependency(string[] cacheKeys)

  {

  ICacheManager cacheManager = CacheFactory.GetCacheManager();

  foreach (string cacheKey in cacheKeys)

  {

  if (cacheManager != null && cacheManager.Contains(cacheKey))

  {

  int lastCount = (int)cacheManager.GetData(cacheKey); if (lastCount < Int32.MaxValue) { lastCount++;

  }

  else

  {

  lastCount = Int32.MinValue;

  } // 这一句的作用在于更新以cacheKey为key的缓存项,从而使依赖于此缓存项的缓存项失效. cacheManager.Add(cacheKey, lastCount);

  }

  }

  }

  }

  using System;

  using System.Web;

  using Microsoft.Practices.EnterpriseLibrary.Caching;

  ///

  ///DataAccessUtil 的摘要说明

  ///

  public class DataAccessUtil

  {

  public DataAccessUtil()

  {

  //

  //TODO: 在此处添加构造函数逻辑

  //

  }

  ///

  /// 更新所有以cacheKeys中元素为key的缓存项

  ///

  /// 缓存项的key的数组

  public static void UpdateCacheDependency(string[] cacheKeys)

  {

  ICacheManager cacheManager = CacheFactory.GetCacheManager();

  foreach (string cacheKey in cacheKeys)

  {

  if (cacheManager != null && cacheManager.Contains(cacheKey))

  {

  int lastCount = (int)cacheManager.GetData(cacheKey);

  if (lastCount < Int32.MaxValue)

  {

  lastCount++;

  }

  else

  {

  lastCount = Int32.MinValue;

  }

  // 这一句的作用在于更新以cacheKey为key的缓存项,从而使依赖于此缓存项的缓存项失效.

  cacheManager.Add(cacheKey, lastCount);

  }

  }

  }

  }

  step3  测试实体,下面只是个简单的测试,大家可以发散一下,写出更加有复用性的方法。

  Codeusing System;

  using System.Collections.Generic;

  using System.Linq;

  using System.Web;

  using System.Web.UI;

  using System.Web.UI.WebControls;

  using Microsoft.Practices.EnterpriseLibrary.Caching;

  public partial class Test : System.Web.UI.Page

  {

  protected void Page_Load(object sender, EventArgs e)

  {

  if (!IsPostBack)

  {

  ICacheManager cacheManager = CacheFactory.GetCacheManager();

  cacheManager.Add("s", TextBox1.Text, CacheItemPriority.Normal, null, new CacheItemDependency("s1"));

  this.Label1.Text = cacheManager.GetData("s") as string;

  }

  } protected void Button1_Click(object sender, EventArgs e)

  {

  ICacheManager cacheManager = CacheFactory.GetCacheManager();

  DataAccessUtil.UpdateCacheDependency(new string[] { "s1" });

  if (cacheManager.GetData("s") == null)

  {

  cacheManager.Add("s", TextBox1.Text, CacheItemPriority.Normal, null, new CacheItemDependency("s1"));

  } this.Label1.Text = cacheManager.GetData("s") as string;

  }

  }

相关内容
赞助商链接