前几天看IBuySpy时记在OneNote里面的笔记
点击次数:20 次 发布日期:2008-11-26 15:21:14 作者:源代码网
|
源代码网推荐 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/ 源代码网推荐 做人要厚道,请注明转自酷网动力(www.ASPCOOL.COM)。 源代码网推荐 源代码网供稿. |
