帝国软件
  设为首页 加入收藏 关于我们
 
解密帝国网站管理系统
栏 目:
 
您的位置:首页 > 技术文档 > ASP.NET编程 >
前几天看IBuySpy时记在OneNote里面的笔记
作者:kaneboy 发布时间:2005-03-12 来源:ASPCOOL
    
  IBuySpy Portal 中使用 PortalModuleControl 这个继承自UserControl的类来作为站点中所有Module的基类,用户控件的工作方式是,当页面上实例化一个用户控件时,自动将它的所有子控件全部Render成HTML,然后输出,为了提高Module的工作效率,每个Module可以设置自己的缓存时间,在缓存时间内,系统不会再重复Render它的所有子控件,而是在第一次Render的时候,把结果HTML文本缓存起来,当下次需要的时候再直接输出。
  
  
  
  实现缓存功能,IBuySpy是通过CachedPortalModuleControl实现的。
  
  
  
  因为IBuySpy页面上的Module都是通过LoadControl()方法来动态载入到页面上的,像这样:
  
  
  
  PortalModuleControl portalModule = (PortalModuleControl) Page.LoadControl(_moduleSettings.DesktopSrc);
  
  
  
  portalModule.PortalId = portalSettings.PortalId;
  portalModule.ModuleConfiguration = _moduleSettings;
  
  
  
  parent.Controls.Add(portalModule);
  
  
  
  当检测到一个Module的CacheTime>0时,代码则:
  
  
  
  CachedPortalModuleControl portalModule = new CachedPortalModuleControl();
  
  
  
  portalModule.PortalId = portalSettings.PortalId;
  portalModule.ModuleConfiguration = _moduleSettings;
  
  
  
  parent.Controls.Add(portalModule);
  
  
  
  就是说,代码不会再载入PortalModuleControl类型的控件了,而是载入CachedPortalModuleControl来实现的。
  
  
  
  下面看看CachedPortalModuleControl是如何实现缓存的:
  
  
  
  private String _cachedOutput = "";
  
  
  
  这里定义了一个String变量,保存缓存的内容
  
  
  
  protected override void CreateChildControls() {
  
  
  
  if (_moduleConfiguration.CacheTime > 0) {
  
  _cachedOutput = (String) Context.Cache[CacheKey];
  
  }
  
  
  
  CreateChildControls()这个方法是在Control类每次被实例化时,都会执行的方法。首先检查这个Module是否启用了缓存,如果启用了,则从Context.Cache中寻找缓存,并载入到_cachedOutput中。
  
  (CachedPortalModuleControl实质上是一个Composite Control,有关复合控件的相关资料,参阅:
  
  ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/
  cpcondevelopingcompositecontrols.htm)
  
  
  
  if (_cachedOutput == null) {
  
  
  
  base.CreateChildControls();
  
  
  
  PortalModuleControl module = (PortalModuleControl) Page.LoadControl(_moduleConfiguration.DesktopSrc);
  
  
  
  module.ModuleConfiguration = this.ModuleConfiguration;
  
  module.PortalId = this.PortalId;
  
  
  
  this.Controls.Add(module);
  
  }
  
  
  
  如果_cachedOutput为null,那么说明还没有缓存,于是调用base.CreateChildControls(),然后用LoadControl()方法重新(真实的)载入控件,并把这个控件放入本控件的子控件树中。
  
  
  
  protected override void Render(HtmlTextWriter output) {
  
  
  
  if (_moduleConfiguration.CacheTime == 0) {
  
  base.Render(output);
  
  return;
  
  }
  
  
  
  现在到了Render方法,这个方法用于输出控件的HTML,首先检查是否启用缓存,如果没有,直接调用base.Render()直接输出,然后return。
  
  
  
  if (_cachedOutput == null) {
  
  
  
  TextWriter tempWriter = new StringWriter();
  
  base.Render(new HtmlTextWriter(tempWriter));
  
  _cachedOutput = tempWriter.ToString();
  
  
  
  Context.Cache.Insert(CacheKey, _cachedOutput, null, DateTime.Now.AddSeconds(_moduleConfiguration.CacheTime), TimeSpan.Zero);
  
  }
  
  
  
  如果启用了缓存,但是用来保存缓存内容的变量为null,那么就调用base.Render()方法,把所有应该输出的HTML输出到_cachedOutput变量中,然后把这个变量的内容放入Context.Cache中。
  
  
  
  output.Write(_cachedOutput);
  
  
  
  最后,把这个变量中的HTML内容输出。
  
  作者:kaneboy Blog:http://blog.joycode.com/kaneboy/
  

  
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
无相关信息

   栏目导行
  PHP编程
  ASP编程
  ASP.NET编程
  JAVA编程
   站点最新
·致合作伙伴的欢迎信
·媒体报道
·帝国软件合作伙伴计划协议
·放眼未来 帝国近期将有重大举措!
·PHPWind6.3.2版通行证发布
·帝国备份王2008版正式发布
·帝国备份王2008版发布
·phpcms2007转帝国CMS5.0程序发布
·dedecms5.1转帝国CMS5.0程序发布
·帝国网站管理系统V5.0商业购买说明
   类别最新
·ASP.NET中为DataGrid添加合计字段
·.text urlRewrite介绍
·利用 ASP.NET 的内置功能抵御 Web
·ASP.NET Cache
·用 WebClient.UploadData 方法 上载
·ASP.NET 程序设计-序
·什么是客户端/伺服端(Client/Serve
·因特网应用程序的开发
·网页的种类
·.NET Framework-Microsoft Visual
 
关于帝国 | 广告服务 | 联系我们 | 程序开发 | 网站地图 | 留言板 帝国网站管理系统