微软企业库5.0 学习之路——第十步、使用unity解耦你的系统—part5——使用unity自身的拦截器_第1页
微软企业库5.0 学习之路——第十步、使用unity解耦你的系统—part5——使用unity自身的拦截器_第2页
微软企业库5.0 学习之路——第十步、使用unity解耦你的系统—part5——使用unity自身的拦截器_第3页
微软企业库5.0 学习之路——第十步、使用unity解耦你的系统—part5——使用unity自身的拦截器_第4页
微软企业库5.0 学习之路——第十步、使用unity解耦你的系统—part5——使用unity自身的拦截器_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

微软企业库 5.0 学习之路第十步、使用 Unity 解耦你的 系统PART5使用 Unity 自身的拦截器 作者:HeroBeast 来源:博客园 发布时间:2010-12-27 10:16 阅读:4 次 原文链接 收藏 在前面的企业库学习之路里我分别使用了 Data Access 构建多数据库访问和使用 Exception Handle+Logging 记录系统的异常。今天我来介绍下企业库中的 Caching 模 块在本项目中如何应用。 首先先补习下企业库的 Caching Application Block 的相关知识: 1、四大缓存方式,在 Caching Application Block 中,主要提供以下四种保存缓存数据 的途径,分别是:内存存储(默认)、独立存储(Isolated Storage)、数据库存储 (DataBase Cache Storage)和自定义存储(Custom Cache Storage)。 2、多种存储方式,抛开自定义存储不谈,内存存储是最基本的缓存,仅仅是将数据缓存 到内存当中,虽然速度快但是无法进行持久化存储,而独立存储和数据库存储一个是存储 到本地的磁盘中(视操作系统不同存储到不同的位置)而另一个则是存储到数据库中(方 便进行分布式缓存),所以可以进行持久化保存不会因为关机而丢失(可以到。在 EntLib50SrcBlocksCachingSrcDatabaseScripts 下找到脚本进行安装) 3、优秀的易用性,虽然在.NET 类库 System.Web 中已经提供了 Cache 类,但是有局 限性,仅可适用于控制台、Winform、Web、服务等。 4、安全性,企业库中的缓存模块可以和加密模块很好的结合起来,当适用数据库缓存、 独立存储或者自定义存储的时候可以适用加密模块对缓存的数据进行加密,但存储到内存 当中的数据就无法进行加密了。 在了解了缓存的基本知识后我们就可以开始进行具体的操作了。 我现在就是使用 Cache 模块为项目中反射具体数据库 DAL 层对象实例进行缓存,这样不 用每次在调用底层的时候都反射一次,只需在第 1 次反射后缓存,以后的访问直接从缓存 中读取,提高了访问的速度。 通过企业库配置工具添加个 Caching Settings 这里使用默认设置,保存到内存中,过期轮询时间,最大存储数量和移除数量都使用了默 认的设置。 如果不想使用默认的内存存储可以建立独立存储或者数据库存储。 这里有个要提的就是企业库的缓存模块的数据库存储是使用存储过程来进行缓存与数据库 之间的交互,但是本项目中使用了多数据库,如 Sqlite,就无法支持存储过程,所以这边 需要自定义存储方式,可以直接查看企业库代码中 Cache.DataBase.DataBackingStore.cs 类,仿照 DataBackingStore 类自定义一个 存储方式,只不过在进行数据库交互的时候使用 SQL 语句进行。 继续回到主题上,我这边写了一个简单的 CacheHelper,用以操作缓存,其中我自定义 了一个缓存刷新操作类(此类必须为可序列化),用于将已经过期的对象重新加入到缓存 当中,代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using Microsoft.Practices.EnterpriseLibrary.Caching; using Microsoft.Practices.EnterpriseLibrary.Caching.Expirations; using Microsoft.Practices.EnterpriseLibrary.Common.Configuration; namespace EntLibStudy.Helper public static class CacheHelper /2 种建立 CacheManager 的方式 /ICacheManager cache = EnterpriseLibraryContainer.Current.GetInstance(); private static ICacheManager cache = CacheFactory.GetCacheManager(); / / 添加缓存 / / 键 / 值 / 是否刷新 public static void Add(string key, object value, bool isRefresh = false) if (isRefresh) /自定义刷新方式 ,如果过期将自动重新加载 ,过期时间为 5 分钟 cache.Add(key, value, CacheItemPriority.Normal, new MyCacheItemRefreshAction(), new AbsoluteTime(TimeSpan.FromMinutes(5); else cache.Add(key, value); / / 获取缓存对象 / / 键 / public static object GetCache(string key) return cache.GetData(key); / / 移除缓存对象 / / 键 public static void RemoveCache(string key) cache.Remove(key); / / 自定义缓存刷新操作 / Serializable public class MyCacheItemRefreshAction : ICacheItemRefreshAction #region ICacheItemRefreshAction 成员 / / 自定义刷新操作 / / 移除的键 / 过期的值 / 移除理由 void ICacheItemRefreshAction.Refresh(string removedKey, object expiredValue, CacheItemRemovedReason removalReason) if (removalReason = CacheItemRemovedReason.Expired) ICacheManager cache = CacheFactory.GetCacheManager(); cache.Add(removedKey, expiredValue); #endregion 1、缓存等级,在企业库的缓存模块中已经提供了 4 个缓存等级: Low,Normal,High 和 NotRemovable,在超出最大缓存数量后会自动根据缓存 等级来移除对象。 2、ICacheItemRefreshAction,这个接口用来方便开发人员扩展使用的,开发人员 可以根据移除原因在对象过期后进行相应的操作,其中 CacheItemRemovedReason 分 Expired:过期被移除 Removed:被手动移除 Scavenged:因为缓存数量已满,则根据缓存等级移除较低级的缓存 Unknown:未知移除,不建议使用 3、过期方式,企业库默认提供 4 种过期方式 AbsoluteTime:绝对是时间过期,传递一个时间对象指定到时过期 SlidingTime:缓存在最后一次访问之后多少时间后过期,默认为 2 分钟,有 2 个构造 函数可以指定一个过期时间或指定一个过期时间和一个最后使用时间 public SlidingTime(TimeSpan slidingExpiration) / Check that expiration is a valid numeric value if (!(slidingExpiration.TotalSeconds = 1) throw new ArgumentOutOfRangeException(“slidingExpiration“, Resources.ExceptionRangeSlidingExpiration); this.itemSlidingExpiration = slidingExpiration; public SlidingTime(TimeSpan slidingExpiration, DateTime originalTimeStamp) : this(slidingExpiration) timeLastUsed = originalTimeStamp; ExtendedFormatTime :指定过期格式,以特定的格式来过期,通过 ExtendedFormat.cs 类来包装过期方式,具体可参照 ExtendedFormat.cs,源代码中 已经给出了很多方式 FileDependency:依赖于文件过期,当所依赖的文件被修改则过期,这个我觉得很有 用,因为在许多网站,如论坛、新闻系统等都需要大量的配置,可以将配置文件信息进行 缓存,将依赖项设为配置文件,这样当用户更改了配置文件后通过 ICacheItemRefreshAction.Refresh 可以自动重新缓存。 在介绍了 Cache 的相关参数后我们来看下具体如何使用,我这边将原来的 DataAccess 类重新修改了一下,因为觉得如果每次多增加一个数据表,对应的工厂就需要多写一个反 射方法实在是不方便,所以修改成泛型类(同时附了原来的反射代码,可以对比下那种方 式比较好),在 BLL 层调用的时候只需传递要转成的接口即可,代码如下: public static class DataAccess private static readonly string assemblyString = ConfigurationManager.AppSettings“DAL“; / / 通用对象反射(包含缓存) / / 要反射的类名 / public static T CreateObject(string className) var typeName = assemblyString + “.“ + className; /判断对象是否被缓存, 如果已经缓存则直接从缓存中读取,反之 则直接反射并缓存 var obj = (T)CacheHelper.GetCache(typeName); if (obj = null) obj = (T)Assembly.Load(assemblyString).CreateInstance(typeName, true); CacheHelper.Add(typeName, obj, true); return obj; public static IClassInfoService CreateClassInfo() string typeName = assemblyString + “.ClassInfoService“; /判断对象是否被缓存, 如果已经缓存则直接从缓存中读取,反之 则直接反射并缓存 if (CacheHelper.GetCache(typeName) != null) return (IClassInfoService)CacheHelper.GetCache(typeName); else IClassInfoService service = (IClassInfoService)Assembly.Load(assemblyString).CreateInstanc e(typeName, true); CacheHelper.Add(typeName, service, true); return service; 需要注意的是由于使用企业库的 Cache,如果缓存到数据库或者独立存储必须要求缓存 对象必须是可序列化的,内存中缓存就不需要,而我这边缓存的对象为 DAL 层中具体的 操作类,所以如果要更改为非内存存储需要将操作类加上Serializable特性。 这样以后再添加新的表就无需修改工厂中的 DataAccess 类了。 以上就是缓存在本项目中的一些基本应用,由于水平有限,所以暂时无法提出缓存的一些 高级应用,请大家见谅。 相关 Cache 模块配置可以查看 huangcong 写的 Cache 模块(初级),一些相关知识可以 查看 virusswb 写的缓存的设计目的 。 注意: 1、MSSQL 数据库在 DataBase 目录下(需要自行附加数据库),SQLite 数据库在 Web 目录的 App_Data 下,由于考虑到项目的大小,所以每个项目的 BIN 目录都已经 删除,如出现无法生成项目请自行添加相关企业库的 DLL。 2、由于微软企业库 5.0 学习之路这个系列我是准备以一个小型项目的形式介绍企业库的 各模块,所以源代码会根据系列文章的更新而更新,所以源代码不能保证与文章中所贴代 码相同。 3、项目开发环境为:VS2010+SQL2005。 4、管理员帐户:admin 密码:admin 源代码下载地址:点我下载 微软企业库 5.0 学习之路系列文章索引: 第一步、基本入门 第二步、使用 VS2010+Data Access 模块建立多数据库项目 第三步、为项目加上异常处理(采用自定义扩展方式记录到数据库中) 第四步、使用缓存提高网站的性能(EntLib Caching) 第五步、介绍 EntLib.Validation 模块信息、验证器的实现层级及内置的各种验证器的使 用方法上篇 第五步、介绍 EntLib.Validation 模块信息、验证器的实现层级及内置的 各种验证器的使用方法中篇 第五步、介绍 EntLib.Validation 模块信息、验证器的实现层级及内置的各种验证器的使 用方法下篇 第六步、使用 Validation 模块进行服务器端数据

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论