以PetShop.BLL.Product业务对象为例,PetShop为其建立了代理对象ProductDataProxy,并在GetProductByCategory()等方法中,引入了缓存机制,例如:
  public static class ProductDataProxy
  {
  
   private static readonly int productTimeout = int.Parse(ConfigurationManager.AppSettings[”ProductCacheDuration”]);
   private static readonly bool enableCaching = bool.Parse(ConfigurationManager.AppSettings[”EnableCaching”]);
  
   public static IList
  GetProductsByCategory(string category)
   {
   Product product = new Product();
  
   if (!enableCaching)
   return product.GetProductsByCategory(category);
  
   string key = “product_by_category_” + category;
   IList data = (IList )HttpRuntime.Cache[key];
  
   // Check if the data exists in the data cache
   if (data == null)
   {
   data = product.GetProductsByCategory(category);
  
   // Create a AggregateCacheDependency object from the factory
   AggregateCacheDependency cd = DependencyFacade.GetProductDependency();
  
   // Store the output in the data cache, and Add the necessary AggregateCacheDependency object
   HttpRuntime.Cache.Add(key, data, cd, DateTime.Now.AddHours(productTimeout), Cache.NoSlidingExpiration, CacheItemPriority.High, null);
   }
   return data;
   }
  }
  
  与业务逻辑层Product对象的GetProductsByCategory()方法相比,增加了缓存机制。当缓存内不存在相关数据项时, 则直接调用业务逻辑层Product的GetProductsByCategory()方法来获取数据,并将其与对应的 AggregateCacheDependency对象一起存储在缓存中。
  
  引入Proxy模式,实现了在缓存级别上对业务对象的封装,增强了对业务对象的控制。由于暴露在对象外的方法是一致的,因而对于调用方而言,调用代理对象与真实对象并没有实质的区别。
  
  从职责分离与分层设计的角度分析,我更希望这些Proxy对象是被定义在业务逻辑层中,而不像在PetShop的设计那样,被划分到表示层 UI中。此外,如果需要考虑程序的可扩展性与可替换性,我们还可以为真实对象与代理对象建立统一的接口或抽象类。然而,单以PetShop的表示层调用来 看,采用静态类与静态方法的方式,或许更为合理。我们需要谨记,“过度设计”是软件设计的警戒线。
  
  如果需要对UI层采用缓存机制,将应用程序数据存放到缓存中,就可以调用这些代理对象。以ProductsControl用户控件为例,调用方式如下:
  productsList.DataSource = ProductDataProxy.GetProductsByCategory(categoryKey);
  
  productsList对象属于自定义的CustomList类型,这是一个派生自System.Web.UI.WebControls.DataList控件的类,它的DataSource属性可以接受IList集合对象。
  不过在PetShop 4.0的设计中,对于类似于ProductsControl类型的控件而言,采用的缓存机制是页输出缓存。我们可以从ProductsControl.ascx页面的Source代码中发现端倪:
  < %@ OutputCache Duration="100000" VaryByParam="page;categoryId" %>
  
  与ASP.NET 1.x的页输出缓存不同的是,在ASP.NET 2.0中,为ASP.NET用户控件新引入了CachePolicy属性,该属性的类型为ControlCachePolicy类,它以编程方式实现了对 ASP.NET用户控件的输出缓存设置。我们可以通过设置ControlCachePolicy类的Dependency属性,来设置与该用户控件相关的 依赖项,例如在ProductsControl用户控件中,进行如下的设置:
  protected void Page_Load(object sender, EventArgs e)
  {
   this.CachePolicy.Dependency = DependencyFacade.GetProductDependency();
  }
  
  采用页输出缓存,并且利用ControlCachePolicy设置输出缓存,能够将业务数据与整个页面放入到缓存中。这种方式比起应用程序 缓存而言,在性能上有很大的提高。同时,它又通过引入的SqlCacheDependency特性有效地避免了“数据过期”的缺点,因而在PetShop 4.0中被广泛采用。相反,之前为Product、Category、Item业务对象建立的代理对象则被“投闲散置”,仅仅作为一种设计方法的展示而 “幸存”与整个系统的源代码中。

转载于:https://www.cnblogs.com/dequan-lee/archive/2007/04/27/729309.html

PetShop之ASP.NET缓存--three相关推荐

  1. PetShop之ASP.NET缓存

    <解剖PetShop>系列之四 四 PetShop之ASP.NET缓存 如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引 ...

  2. PetShop之ASP.NET缓存(转载)

    <解剖PetShop>系列之四 四 PetShop之ASP.NET缓存 如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引 ...

  3. [wayfarer]PetShop之ASP.NET缓存

    原文地址: http://www.cnblogs.com/wayfarer/archive/2006/11/01/547060.html <解剖PetShop>系列之四 四 PetShop ...

  4. petshop4.0 详解之四(PetShop之ASP.NET缓存)

    <p>如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引入了这种名为高速缓冲存储器(Cache)的技术.因为Cache的存 ...

  5. PetShop 4.0 详解之四(PetShop之ASP.NET缓存)

    如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引入了这种名为高速缓冲存储器(Cache)的技术.因为Cache的存取速度比内存快,因 ...

  6. PetShop之ASP.NET缓存 --one

    如果对微型计算机硬件系统有足够的了解,那么我们对于Cache这个名词一定是耳熟能详的.在CPU以及主板的芯片中,都引入了这种名为高速缓冲存储器 (Cache)的技术.因为Cache的存取速度比内存快, ...

  7. 浅谈ASP.NET 缓存技术

    缓存是指系统或应用程序将频繁使用的数据保存到内存中,当系统或应用程序再次使用时,能构快速的获取数据.它的弊端在于显示的内容可能不是最新,最精确的.ASP.Net 缓存主要分为两大类: 网页输出缓存和应 ...

  8. asp.net缓存机制

    一.缓存的类别 1.页面输出ASP.NET数据缓存 页面输出缓存是一种传统级别的相对简单的缓存机制.它将页面数据缓存在服务器内存中,当有客户端再次请求这些内容的时候,服务器可以直接将这些页面数据输出, ...

  9. [转]ASP.Net缓存总结

    ASP.Net缓存总结 Asp.net 缓存技术总结 2008-04-01 17:29 提高性能最好最快的办法当然是通过缓存来改善,对于任何一个web开发者都应该善用缓存.Asp.net下的缓存机制十 ...

最新文章

  1. 1乘到100 python_python每日一练之如何计算你的应发奖金?
  2. Nature子刊 | 研究人员提出神经脆性可作为癫痫发作区(SOZ)的脑电图(EEG)标志物
  3. String常用方法大全(深入源码层面分析)
  4. 数据科学 IPython 笔记本 8.4 简单的折线图
  5. python环境及pycharm开发环境安装_Python PyQt5 Pycharm 环境搭建及配置详解(图文教程)...
  6. Java编译器调试不了_使用Maven设置Java编译器的-source和-target-不起作用
  7. 类型约束的本质:泛型是不完备类型,只有合乎要求的构造才能正确使用和访问。...
  8. 做网站用UTF-8编码还是GB2312编码?
  9. mysql 文本处理函数,MySQL常用的文本处理函数
  10. Croe文件在线预览
  11. 【Java设计模式】——工厂模式
  12. python倒计时弹框提示带注释_注意时间用python制作倒计时提醒工具
  13. PS网页设计教程XVII——在Photoshop中设计创意组合网页
  14. 应用宝认领应用签名_腾讯开放平台第三方应用签名参数sig的说明
  15. oracle付权,oracle权限总结
  16. 【机器学习】机器学习模型迭代方法(Python)
  17. 系统对接方案_报销费控SaaS对接财务系统解决方案
  18. PTA 吉老师的回归
  19. java记事本的撤回_对于记事本,怎样恢复刚刚撤销的?
  20. [数学理论]最大熵模型

热门文章

  1. 5.8 正则化和数据标准化
  2. jsp调用controller方法_SpringMVC五大核心组件及调用过程
  3. SQL server management 查询所有触发器
  4. biee mysql_BIEE 11g linux下连接mysql数据源
  5. 小红书最新用户量数据_小红书估值高达60亿美元?小红书超过蘑菇街了吗?
  6. #17# SCCM管理 - 软件中心 VS 应用程序目录网站点
  7. 小程序跳转页面与传值
  8. lamp架构-访问控制-禁止php解析、屏蔽curl命令访问
  9. Kubernetes应用部署模型解析(原理篇)
  10. c++中algorithm头文件、STL库简介及使用说明