Enterprise Library4.0 Cache Application Block实例讲解
Enterprise Library 4.0 – May 2008是Microsoft patterns & practices Enterprise Library的新的版本,Enterprise Library有一系列的应用程序块及一个核心的特性(诸如对象创建、配置文件机制)组成,所有的这些都是可重用的组件,他们被设计来帮助开发人员应对常见的企业开发所面临的挑战,4.0这个版本还添加了一个新的应用程序块- Unity Application Block,这个新的应用程序块为对象产生和依赖注入提供了容器,除此以外4.0还添加了一些其他的新特性.
下面我们就用实例的方式来运用Cache Application Block:
首先我们需要在项目中引用两个dll:
Microsoft.Practices.EnterpriseLibrary.Common.dll;
Microsoft.Practices.EnterpriseLibrary.Caching.dll;
在项目中添加配置文件app.config或者web.config(当然asp.net可以采用它本身现有的cache技术)
然后右键config文件选择Edit Enterprise Library Configuration打开界面化的配置文件编辑工具:
打开编辑工具后
设置Default chche manager的相关参数,例如:
参数说明:
1.ExpirationPollFrequencyInSecond:指过期轮询周期,就是多长时间就检查一下有哪些缓存项过期了,由后台独立进程执行。这个参数很关键,如果时间设置的太短,就会使这个后台进程不断执行,占用大量CPU时间,如果太长,又会浪费内存,要找个不长不短的,推荐用性能计数器监测一下,选一个适中的参数。
2.MaximumElementsLnCacheBeforeScavenging:缓冲中的最大元素数量。
3.Name:Cache Manage的名字,可以常见多个Cache Manage,以使用不同的缓冲策略。
4.NumberToRemoveWhenScavenging:一次移除的数量。
将Caching Application Block的DefaultCacheManager属性值设置为刚才你设置的cache manager的名称,如下图:
至此,我们的cache最简洁的配置就完成了,下面我们开始完成我们代码的编写
1. 首先我们创建CacheManager的实例:
//实例化CacheManager
ICacheManager productsCache = CacheFactory.GetCacheManager();
2. 创建缓存过期的时间(我们在这里创建三种过期时间):
//方法一:时间段(当30秒后过期)
SlidingTime expireTime = new SlidingTime(TimeSpan.FromSeconds(30));
//方法二:绝对时间(每个小时的第6分钟过期)表达式的格式:<Minute> <Hour> <Day of month> <Month> <Day of week>
ExtendedFormatTime expireTime = new ExtendedFormatTime("6 * * * * *");
//方法三:依赖文件(当文件DependencyFile.txt改变时过期)
FileDependency expireTime = new FileDependency("DependencyFile.txt");
3. 将数据添加到缓存当中
productsCache.Add(product.Pid, product, CacheItemPriority.Normal, new ProductCacheRefreshAction(), expireTime);
(注释:1.product 为 Product类的实例,Product类的实际设计我将在后面贴出来 2. new ProductCacheRefreshAction是缓存中的条目过期或者被移除或者被策略性的被删除时激活的对象)
4. 获取缓存中的数据
Products p1 = new Products();
p1 = (Products)productsCache.GetData(product.Pid);
//输出显示
Console.WriteLine("p1产品的ID为:" + p1.Pid + "\n");
Console.WriteLine("p1产品的Name为:" + p1.PName + "\n");
Console.WriteLine("p1产品的Price为:" + p1.Price.ToString() + "\n");
另:Product类的设计如下:
public class Products
{
private string pid;
public string Pid
{
get { return pid; }
set { pid = value; }
}
private string pName;
public string PName
{
get { return pName; }
set { pName = value; }
}
private decimal price;
public decimal Price
{
get { return price; }
set { price = value; }
}
}
ProductCacheRefreshAction类的设计如下(注:类必须实现ICacheItemRefreshAction接口,而且需要是可序列化的,需要加上[Serializable]):
//过期类,该类在以下情况下被激活:
//1.当条目过期了
//2.条目被显式的从缓存中移除了
//3.条目被策略的从缓存中清除了
[Serializable]
public class ProductCacheRefreshAction:ICacheItemRefreshAction
{
///<summary>
///过期响应方法
///</summary>
///<param name="key">过期的条目</param>
///<param name="expiredValue"></param>
///<param name="removalReason">过期的原因(过期、被移除或者其他)</param>
public void Refresh(string key, object expiredValue, CacheItemRemovedReason removalReason)
{
#region add method
//To add you code;
#endregion
}
}
好了,到这里实例就写完了。^^ Brave chen