Dappers 开发入门 (5) - 缓存
Dappers内部定义了3个重要的Info对象: MappingInfo, StatementInfo, QueryInfo
- MappingInfo对应了一个Domain实体对象,描述了 类/表 , 属性/列名 映射关系。 自动的sql语句创建也是基于 MappingInfo. Select , MappingInfo.Update, MappingInfo.Delete, MappingInfo.Insert 。根据主键, 属性的Attribute描述,可以指定某些属性不映射到列, 可以指定某些属性仅可Insert不可Update等。
- StatementInfo对应了类myBatis 的sql配置的每一个key-value。它将value解析为 Sql、DynamicCriterias。 执行语句时,只需动态遍历参数,即可确定当前有效的Criteria,从而构建完整sql语句。 internal class Criteria
{
public bool? IsOr { get; set; }
public bool IsInClause { get; set; }
public string[] Cons { get; set; }
public string ParamName { get; set; }
public string Criterion { get; set; }
} - QueryInfo是一个查询请求的封装:QueryInfo.MappingType, QueryInfo.Sql, QueryInfo.Parameters,QueryInfo.Wheres, QueryInfo.OrderBy. 同时还有分页信息: QueryInfo.StartRecord, QueryInfo.PageSize,QueryInfo.TotalCount , 以及返回结果集: QueryInfo.List
默认设置下,每当请求首次涉及MappingInfo、StatementInfo时, 才会创建该对象。并自动加入LRU缓存池。 任何30分钟没有再次访问、Info总量超过200条时, 都会移除最少访问的记录。
编辑页缓存:
通常一个列表,都可以链接、弹出响应的明细编辑界面。通常,每次载入不同的行,明细界面载入不同的数据:
- iframe重新载入图片、脚本、html资源,重新渲染生成界面
- 执行初始脚本,初始化Datepicker, comboBox,comboTree 等的数据载入
- 载入数据,并逐一设置控件值
所以这里对window做了处理: 初次打开window之后, 这个iframe创建;窗口关闭,iframe的div隐藏即可。 再次打开窗口,检测url是否一致,一致则直接弹出该frame,并根据额外参数,除非frame载入数据:
WIN.open({title:gridview.title,
url:gridview.editUrl,
param:'Id='+id,
id:EDITOR_ID,
width:gridview.editWidth,
height:gridview.editHeight,
maximized:gridview.editMaximized,
maximizable:gridview.editMaximizable,
modal:true
url:gridview.editUrl,
param:'Id='+id,
id:EDITOR_ID,
width:gridview.editWidth,
height:gridview.editHeight,
maximized:gridview.editMaximized,
maximizable:gridview.editMaximizable,
modal:true
});
可见,页面载入不再是: test.aspx?Id=0001 的方式, 而是
1.页面载入 test.aspx ,
2.载入后立即执行 loadData('Id=0001') ,以ajax的方式载入数据。
当Id变成 0002 的时候,
1. 弹出window
2.loadData('Id=0002' ) ,载入数据。
当列表页面关闭时,列表的关闭事件自动清理所关联的window。从而实现窗体的缓存与过期。
这种缓存方式,在GIS地图展示时效果尤其明显: 每次重新地位, 地图瞬间打开,并动画的方式移动地图切换到新的坐标点。不会出现地图界面载入困难, 局部区域空白再逐步载入等问题, 大大提高了体验效果。