信息系统开发平台OpenExpressApp - 数据懒加载
2009-12-26 00:19
555 查看
阅读: 941 评论: 1 作者: 快乐学习 发表于 2009-12-13 13:28 原文链接
性能是应用开发中经常要考虑的质量属性之一,本篇讲解一下OpenExpressApp目前对数据懒加载的处理。
方案:当模块打开(或者查询)时获取的列表对象仅仅是根对象信息,当点击某列表记录时才去获取实际的整个聚合。
每个根对象实现一个GetRoot方法,只获取聚合中的根对象信息,不获取子对象属性
每个根对象实现一个Get方法,获取整个聚合
当获取列表时系统调用GetRoot方法,获取单个对象时调用Get方法
注意:这个只是针对根对象有效,子对象懒加载根据性懒加载来处理。
方案:在客户端获取数据时,我们希望一次性能够尽可能获取更多的数据,但数据量大时则需要要考虑分批获取数据。对于子对象很大时,采用子对象属性懒加载,UI上进行相应控制,当点击子对象页签时才去服务器端获取数据。
属性懒加载编写代码模式如下:《信息系统开发平台OpenExpressApp - 性能相关》中也有相关内容
private static PropertyInfo<ChildType> ChildProperty = RegisterProperty(new PropertyInfo<ChildType>("Child"));
public ChildType Child
{
get
{
if (!FieldManager.FieldExists(ChildProperty))
if (this.IsNew)
LoadProperty(ChildProperty, ChildType.NewChild());
else
LoadProperty(ChildProperty, ChildType.GetChild(this));
return GetProperty(ChildProperty);
}
}
internal ChildType GetChild(ParentType parent)
{
return DataPortal.Fetch<ChildType>(new SingleCriteria<ChildType, int>(parent.Id));
}
private void DataPortal_Fetch(SingleCriteria<ChildType, int> criteria)
{
MarkAsChild();
// load child with data from database
}
注意:懒加载属性需要根据业务对象来定,当每个子对象数据量都很大时,为了减少网络一次性的传输量,这时需要考虑使用子对象属性懒加载方式加载子对象。
方案:从UI上考虑先只加载第一级节点对象,当Expand节点时再建立与子对象的关系,并且加载到树形控件中。
注意:由于关系懒加载会导致操作时的一些复杂性,如果要自己扩展树形操作,则需要在全部关系基础上时确保通过代码建立了所有对象间的关系
发表评论
新闻频道:PHPWIND承认被支付宝收购:发力本地门户网站
推荐链接:Windows 7专题发布
网站导航:博客园首页 个人主页 新闻 社区 博问 闪存 知识库
性能是应用开发中经常要考虑的质量属性之一,本篇讲解一下OpenExpressApp目前对数据懒加载的处理。
列表对象懒加载
问题:在《内置支持的模块类型 》中介绍过系统支持的但据模块类型如下图所示:如果一次性获取所有数据,这将带来大量的数据查询传输,所以需要考虑列表对象的懒加载数据方案:当模块打开(或者查询)时获取的列表对象仅仅是根对象信息,当点击某列表记录时才去获取实际的整个聚合。
每个根对象实现一个GetRoot方法,只获取聚合中的根对象信息,不获取子对象属性
每个根对象实现一个Get方法,获取整个聚合
当获取列表时系统调用GetRoot方法,获取单个对象时调用Get方法
注意:这个只是针对根对象有效,子对象懒加载根据性懒加载来处理。
子对象属性懒加载
问题:还是上面那个图示模块,加入每个子对象的子子对象都有很多记录,那么一次性获取所有对象则会带来大量的数据传输,获取一个对象需要花费较多时间方案:在客户端获取数据时,我们希望一次性能够尽可能获取更多的数据,但数据量大时则需要要考虑分批获取数据。对于子对象很大时,采用子对象属性懒加载,UI上进行相应控制,当点击子对象页签时才去服务器端获取数据。
属性懒加载编写代码模式如下:《信息系统开发平台OpenExpressApp - 性能相关》中也有相关内容
private static PropertyInfo<ChildType> ChildProperty = RegisterProperty(new PropertyInfo<ChildType>("Child"));
public ChildType Child
{
get
{
if (!FieldManager.FieldExists(ChildProperty))
if (this.IsNew)
LoadProperty(ChildProperty, ChildType.NewChild());
else
LoadProperty(ChildProperty, ChildType.GetChild(this));
return GetProperty(ChildProperty);
}
}
internal ChildType GetChild(ParentType parent)
{
return DataPortal.Fetch<ChildType>(new SingleCriteria<ChildType, int>(parent.Id));
}
private void DataPortal_Fetch(SingleCriteria<ChildType, int> criteria)
{
MarkAsChild();
// load child with data from database
}
注意:懒加载属性需要根据业务对象来定,当每个子对象数据量都很大时,为了减少网络一次性的传输量,这时需要考虑使用子对象属性懒加载方式加载子对象。
自关联对象关系和UI懒加载
问题:当自关联对象有好几千个对象时,构造对象间的关系和加载到树形控件中需要较长时间方案:从UI上考虑先只加载第一级节点对象,当Expand节点时再建立与子对象的关系,并且加载到树形控件中。
注意:由于关系懒加载会导致操作时的一些复杂性,如果要自己扩展树形操作,则需要在全部关系基础上时确保通过代码建立了所有对象间的关系
发表评论
新闻频道:PHPWIND承认被支付宝收购:发力本地门户网站
推荐链接:Windows 7专题发布
网站导航:博客园首页 个人主页 新闻 社区 博问 闪存 知识库
相关文章推荐
- 信息系统开发平台OpenExpressApp - 数据权限
- 信息系统开发平台OpenExpressApp - 配置CSLA的WCF数据门户代理
- 信息系统开发平台OpenExpressApp - 数据权限
- 信息系统开发平台OpenExpressApp - 支持差异保存
- 信息系统开发平台OpenExpressApp:OpenTest 之 运行环境准备
- 信息系统开发平台OpenExpressApp - 用户权限模块设计
- 信息系统开发平台OpenExpressApp - 从compositewpf到MEF
- 信息系统开发平台OpenExpressApp - 框架待完善工作事项
- 信息系统开发平台OpenExpressApp - 学习必备知识
- 信息系统开发平台OpenExpressApp - 内置支持的列表编辑方式
- 信息系统开发平台OpenExpressApp:【OpenTest】 之 框架实现说明
- 信息系统开发平台OpenExpressApp - CSLA类库编写
- 信息系统开发平台OpenExpressApp - CSLA类库编写
- 开源信息系统开发平台之OpenExpressApp框架 1.1 春节飞虎版发布
- 信息系统开发平台OpenExpressApp:【OpenTest】 之 框架实现说明
- 信息系统开发平台OpenExpressApp - 学习必备知识
- 信息系统开发平台openexpressapp 1.0发布
- (参考)OpenExpressApp架构-信息系统开发平台
- 开源信息系统开发平台OpenExpressApp 之 总体架构的由来
- 信息系统开发平台OpenExpressApp - 支持勾选视图