项目总结——谈谈封装(抽象工厂+反射+缓存机制)

今天想给大家说的也是刚刚结束的项目中遇到的一个优秀的封装,当然也要拿出来给大家分享了。

背景交代,我们的项目是一个BS的项目,基本的架构是工厂模式三层,所以就用到了抽象工厂加反射,今天要给大家讲的也就是这块的东西——使用缓存文件。

背景交代完毕。

一、首先说一下什么是缓存文件?

msdn上说:

通常,应用程序可以将那些频繁访问的数据,以及那些需要大量处理时间来创建的数据存储在内存中,从而提高性能。例如,如果应用程序使用复杂的逻辑来处理大量数据,然后再将数据作为用户频繁访问的报表返回,避免在用户每次请求数据时重新创建报表可以提高效率。同样,如果应用程序包含一个处理复杂数据但不需要经常更新的页,则在每次请求时服务器都重新创建该页会使工作效率低下。

二、为什么要使用缓存?

ASP.NET为您提供了一个强大的、便于使用的缓存机制,用于将需要大量服务器资源来创建的对象存储在内存中。缓存这些类型的资源会大大改进应用程序的性能。

    缓存(Cache)是一种用空间换取时间的技术,存在于计算机中很多地方,用来将一些慢速设备中的常用数据保存在快速设备中,取数据的时候直接从快速设备中取。比如CPU二级缓存、内存、windows文件读取缓存。缓存是改进网站性能的第一个手段,就像索引是改进数据库性能的第一个手段一样

三、如何使用缓存?

缓存是由 Cache 类实现的;缓存实例是每个应用程序专用的。缓存生存期依赖于应用程序的生存期;重新启动应用程序后,将重新创建 Cache 对象。

设计 Cache 类是为了便于使用。您可以将项放置在 Cache 中,并在以后使用简单的键/值对来检索这些项。

说的上面的这些当然都是官方的语言,下面给大家介绍我的这个项目中是如何使用缓存文件的:

四、说用在哪?

上面说过,“将需要大量服务器资源来创建的对象存储在内存中”大家想想这个B/S程序,一个访问者的一次访问和一万个访问者的一百万次访问,给服务器带来压力的对比就很容易体会缓存的好处了。每一次的访问请求数据库都需要执行耗费资源的反射机制来动态的创建D层的实例。如果使用缓存把第一次创建的实例保存起来,每一次访问都把已经存在创建好的实例拿来用,对服务器来说就节省了好大的一笔开销。而且我们需要保存的也就是D层中屈指可数的几个类。

说的太多了,上代码:

从工厂某一个方法开始:

[csharp] view plaincopyprint?

  1. /// <summary>
  2. /// 创建SqlMaintainRecordInfo数据层接口。维修日志表--韩义
  3. /// </summary>
  4. public static IDAL.IMaintainRecordInfo CreateT_MaintainRecordInfo()
  5. {
  6. string ClassNamespace = AssemblyPath +".SqlMaintainRecordInfo";
  7. object objType=CreateObject(AssemblyPath,ClassNamespace);
  8. return (IDAL.IMaintainRecordInfo)objType;
  9. }
/// <summary>
/// 创建SqlMaintainRecordInfo数据层接口。维修日志表--韩义
/// </summary>
public static IDAL.IMaintainRecordInfo CreateT_MaintainRecordInfo()
{

	string ClassNamespace = AssemblyPath +".SqlMaintainRecordInfo";
	object objType=CreateObject(AssemblyPath,ClassNamespace);
	return (IDAL.IMaintainRecordInfo)objType;
}

和以往直接使用反射机制不同,这个调用CreateObject函数:

[csharp] view plaincopyprint?

  1. //使用缓存--韩义
  2. private static object CreateObject(string AssemblyPath,string classNamespace)
  3. {
  4. object objType = DataCache.GetCache(classNamespace);
  5. if (objType == null)
  6. {
  7. try
  8. {
  9. objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace);
  10. DataCache.SetCache(classNamespace, objType);// 写入缓存
  11. }
  12. catch(System.Exception ex)
  13. {
  14. string str=ex.Message;// 记录错误日志
  15. }
  16. }
  17. return objType;
  18. }
//使用缓存--韩义
private static object CreateObject(string AssemblyPath,string classNamespace)
{
	object objType = DataCache.GetCache(classNamespace);
	if (objType == null)
	{
		try
		{
			objType = Assembly.Load(AssemblyPath).CreateInstance(classNamespace);
			DataCache.SetCache(classNamespace, objType);// 写入缓存
		}
		catch(System.Exception ex)
		{
			string str=ex.Message;// 记录错误日志
		}
	}
	return objType;
}

这个大家也能看到,创建前需要先判断,需要创建的D层类在缓存中是否已经存在,如果如果存在直接返回,如果不存在使用反射机制创建,然后保存,方便以后使用。

其中的DataCache.GetCache和DataCache.SetCache:

[csharp] view plaincopyprint?

  1. /// <summary>
  2. /// 缓存操作类--韩义
  3. /// </summary>
  4. public class DataCache
  5. {
  6. /// <summary>
  7. /// 获取当前应用程序指定CacheKey的Cache值--韩义
  8. /// </summary>
  9. public static object GetCache(string CacheKey)
  10. {
  11. System.Web.Caching.Cache objCache = HttpRuntime.Cache;
  12. return objCache[CacheKey];
  13. }
  14. /// <summary>
  15. /// 设置当前应用程序指定CacheKey的Cache值--韩义
  16. /// </summary>
  17. public static void SetCache(string CacheKey, object objObject)
  18. {
  19. System.Web.Caching.Cache objCache = HttpRuntime.Cache;
  20. objCache.Insert(CacheKey, objObject);
  21. }
  22. }
/// <summary>
/// 缓存操作类--韩义
/// </summary>
public class DataCache
{
	/// <summary>
	/// 获取当前应用程序指定CacheKey的Cache值--韩义
	/// </summary>
	public static object GetCache(string CacheKey)
	{
		System.Web.Caching.Cache objCache = HttpRuntime.Cache;
		return objCache[CacheKey];
	}

	/// <summary>
	/// 设置当前应用程序指定CacheKey的Cache值--韩义
	/// </summary>
	public static void SetCache(string CacheKey, object objObject)
	{
		System.Web.Caching.Cache objCache = HttpRuntime.Cache;
		objCache.Insert(CacheKey, objObject);
	}
}

看到这个我想大家应该会想这里确实也可以使用单例模式--如果有的话返回,没有的话创建返回。

五、这里又为什么不用单例模式。

大家考虑一下单例的实现,是需要定义一个静态的变量用于保存的。这样我们在判断的时候就需要知道具体的存放想要创建的类的变量名(好像有点饶口,大家好好理解)这样我们的判断方法就不能很好的封装。

六、总结:

设计 Cache 类是为了便于使用。您可以将项放置在 Cache 中,并在以后使用简单的键/值对来检索这些项。在WebForm中主要是为了减轻Web服务器压力,在客户端提供了缓存机制,当用户访问的网页内容无变化的请求时就会调用缓存中的内容,这样一来减轻了服务器压力,避免无必要的重复操作,二来使用户网页浏览速度加快,用户体验更好。WebForm是“瘦客户端”。

时间: 2024-10-20 04:38:01

项目总结——谈谈封装(抽象工厂+反射+缓存机制)的相关文章

谈一谈:抽象工厂+反射+配置文件 实现数据访问程序

<大话设计模式>中第15章中<就不能不换DB吗?>引出了我今天要谈论的主题:抽象工厂+反射+配置文件 实现数据访问程序.当时也不甚理解啊!到了机房收费的亲身实践中,终于体会到了这对组合的奥秘. 抽象工厂模式(Abstract Factory) 提供一个创建一系列相关或相互依赖对象的接口,而无需制定它们具体的类.知道它是用来创建工厂的就OK了. 反射 提供了封装程序集.模块和类型的对象.这里仅仅用到反射的一部分功能.且记住它的格式: Assembly.Load("程序集名称

思想上移,行动下移——抽象工厂+反射+配置文件

从网上查找资料的时候发现很多同学都写过这篇博客了,可见我的方向没有跑偏.虽然我们学设计模式的时候已经接触过抽象工厂模式,大话设计模式中每个设计模式都紧密联系生活,而且主人公讲的也相当有趣,但是真正运用起来却没那么简单.可以说小菜只是帮我们理解了各个设计模式的用途以及有确定,真正的理解还需要我们自己动手实践. 为什么要用抽象工厂? 主要就是为了提高软件的灵活性,运用抽象工厂+反射+配置文件可以很方便的更换数据库.引入接口之后,就可以对外提供一致的接口,而我们既可以用SQLServer实现接口,也可

应用抽象工厂+反射实现通用数据源的设计(二)

上篇博文到学生表的一个接口由SqlServerDal和AccessDal层实现具体的方法. 下面定义一个生产抽象产品工厂的接口: 五:定义MySchoolIFactory下IStudentFactory的工厂(引用IStudens接口): public interface IStudentFactory { //产生学生接口的抽象工厂接口 IStudent CreateStudent(); } 六:有两个具体的工厂:SQLServerFactory和AccessFactory(引用MySchoo

使用抽象工厂反射获取不到Dal层对象,未能加载文件或程序集......

Put aside the fog and see the essence 解决问题之前,要明白问题为什么会出现 如果只想单纯的解决这个问题的话,直接把错误复制然后百度就会出现很多很多解决方案 如果你想明白为什么会出现这个错误 1.首先了解反射的机制 任何类库编译完成之后都会生成.dll文件,反射就是从当前反射所在的.dll(DBZQ.Answer.Factory.dll)文件查找.dll 2.我们来看一下程序的代码和文件 web.config DalFacoty代码 我们找到web层的bin目

谈谈我理解的Http缓存机制

前几天看到老铁们分享的面经,谈到 http 缓存机制的问题,痛下决心,一口气研究个明白,分享给大家. 前端的发展越来越迅速,能做的事情越来越多,承担的责任越来越重,通过了解 http 缓存机制,可以帮助广大前端开发工作者提高网站的访问效率,也能有效减轻服务器的压力. http 缓存规则 http缓存机制有两种缓存规则:强缓存 和 对比缓存(也有称为协商缓存), 这个规则是由服务器响应携带的. 第一次请求 无论强缓存还是对比缓存,浏览器第一次请求服务器时候,都先要到缓存数据库去请求是否有缓存数据,

应用抽象工厂+反射实现通用数据源的设计(三)

九:UI层 通过反射实现时,得自动添加以下的文件: 如果要换成Access数据库时需要考入的文件: 改配置文件:

MVC+EF三层+抽象工厂项目搭建

注意:项目经过两次搭建,所以截图中顶级命名空间有ZHH和ZHH2区别,但是架构的内容是一样的,可以将ZHH和ZHH2视为同一命名空间 一:权限管理 二:搜索 |-Lucene.net(速度快)+盘古分词(搜索词拆分)---比模糊查询更模糊 |-模糊查询like效率慢,全盘扫描,不能拆分 盘古分词,分出来的词,用文件存在磁盘内 ,文件并发 ----lock锁->新的问题,效率慢,用户需要等待 生产者消费者模式---优化文件并发 把分词放在队列中(内存集合中),Redis分布式队列 *sesion只

机房重构 抽象工厂+反射+配置文件

重构机房已经开始三个多星期了,从刚开始的一头雾水,到现在的柳暗花明,由开始的无从下手,到现在感觉犹 如脱胎换骨了般.和两个星期前相比,现在明朗了多了,心情也好了不少. 先给大家看一下这次重构的整体架构图: 在前面一篇博文中对三层(UI.BLL.DAL.Entity)http://blog.csdn.net/zhangzijiejiayou/article/details/38226135做了详细的介绍. 本篇博客着重总结一下在三层的基础上我所做的改进,也就是传说中的七层. 1.Facade层(外

vb.net版机房收费——助你学会七层架构(二)反射+抽象工厂

上一篇咱们做好了准备工作,数据库设计和Entity层,现在介绍 4.反射+抽象工厂 反射:用来消除Switch和if的,这里我尽量简单地介绍,以便大家理解.反射其实用起来很简单,你就认为他就是决定:去某个地方找应该要实例化的类是哪个.怎么理解? '************************** '文 件 名:DataAccess '命名空间:Factory '内 容: '功 能: '文件关系: '作 者:邱慕夏 '小 组:邱慕夏 '生成日期:2014-06-09 9:17:51 '版 本