没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
转帖|其它|编辑:郝浩|2011-02-15 13:42:09.000|阅读 1210 次
概述:很久以前就听过延迟加载这个东西,不过没有理解是什么意思,现在算是了解一二了,写点文章作为读书笔记,把自己的想法记录一下,希望对初学者帮助,不管是初学者或者高手如果发现文章那里写得不好或者有更好的思路和做法记得告诉我哦^^。文章打算写成两三篇,这个是第一篇。
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
很久以前就听过延迟加载这个东西,不过没有理解是什么意思,现在算是了解一二了,写点文章作为读书笔记,把自己的想法记录一下,希望对初学者帮助,不管是初学者或者高手如果发现文章那里写得不好或者有更好的思路和做法记得告诉我哦^^。文章打算写成两三篇,这个是第一篇。
在三层结构中我们通常会使用多一个叫做模型层的东西,这一层中最主要做的事情是把数据库中的表 (或者其他数据源,例如xml或者自己定义的一种数据格式)转成对应的类,例如有一个文章表,这时候在这一层就会有一个文章类;文章类的属性对应着文章表的列,例如文章标题属性对应文章标题列。 实体类和数据表一一对应是最简单的情况,这时候实体类和实体类是各自独立存在的,没有出现相互引用的关系。 但是,几乎每一个数据库中的表都是存在关联关系的(关系型数据库),例如除了文章表之外,还会有一个文章分类表,假如说每一篇文章都必须属于一个分类,那么在数据库中表现出来的就是文章表中有一个外键字段指向文章分类表的主键 ,在C#代码中表示出来的是文章类中有一个属性(文章分类ID),通过这个属性我们就可以知道文章所属的分类、并且可以准确地通过代码查询数据库,获取一个文章分类实体类的对象,读取到文章所属分类的相关信息。
以上的过程看起来一点问题都没有,整理一下思路,就是读取数据库,获取一个文章类对象,通过文字类对象中的文章分类ID的值,以这个值为查询条件去数据库中读取数据,获取一个文章分类对象,当然对数据库的操作我们通常 是封装在数据访问层中。然而从面向对象的角度考虑,我们会希望从文章类包含有文章分类的信息,用代码表示文章分类和文章两个实体类如下:
从上面的代码可以看到,在文章实体类中出现了一个Model.ArticleCategory类型的属性Category,我们想要的就是通过这个属性直接读取文章所属分类的详细信息。问题出现了,在数据库访问层中我们从数据库中读取数据去实例化一个文章实体类对象之后, 要选择在什么时候去给Category赋值。
c#代码 protected Model.ArticleCategory _category; public Model.ArticleCategory Category { get { if(_category == null) { // 创建文章分类数据访问层对象 Dal.ArticleCategory articleCategoryDal = new Dal.ArticleCategory(); // 获取文章分类 _category = articleCategoryDal.GetArticleCategoryByCategoryID(CategoryID); } return _category; } // set访问器就不需要了 }
乍看起来似乎没问题,但要考虑一点,在三层结构中数据的传输靠的就是模型层,模型层处于三层之下, 换句话说,模型层不会去引用三层中的任何一层,而上面代码中的GetArticleCategoryByCategoryID很显然是在三层之中,也许是在业务逻辑层或者数据访问层,所以...循环引用了,这种做法也不佳。如何实现对在文章类中对Category属性的数据进行延时加载呢?整理思路,根据需求一步步分析:
换个角度思考,我们能不能在数据访问层中读取数据、初始化一个文章类对象之后给它一个方法,告诉它如果你要 获取自己所属分类信息(文章分类对象)的时候就调用这个方法来拿,不用的时候就不去调用了,免得多链读取一次数据库。 给它一个方法,也就是说把方法传给它咯! 于是想到委托,我们可以在文章类中添加一个委托,这个委托的签名和通过文章分类ID获取文章分类对象 方法的签名一致,在Category属性的get访问器中调用这个委托,这样便解决了可以在get访问器中调用到方法去访问数据库, 也自然实现了延时加载!于是修改实体类代码如下:
c#代码
namespace Model
{
// 文章分类实体类
public class ArticleCategory
{
public int CategoryID { get; set; }
public string CategoryName { get; set; }
}
// 文章实体类
public class Article
{
public int ArticleID { get; set; }
public string Title { get; set; }
public string Cotnent{ get; set; }
public DateTime CreateTime { get; set; }
public int CategoryID { get; set; }
// 文章所属分类
protected Model.ArticleCategory _category;
public Model.ArticleCategory Category
{
get
{
if (_category == null)
{
if (CategoryLazyLoader != null)
{
_category = CategoryLazyLoader(CategoryID);
}
else
{
_category = null;
}
}
return _category ;
}
}
// 文章分类延时加载器(委托)
public Func<int, Model.ArticleCategory> CategoryLazyLoader { get; set; }
}
}
在文章读取数据库得到数据然后创建一个文章类对象之后,我们对CategoryLazyLoader进行赋值就OK了! 文章数据访问类中获取文章的方法大致如下:
c#代码 // 根据文章ID获取文章实体类对象 public Model.Article GetArticleById(int articleId) { // 从数据库中取出数据,得到一个DateRow或者DateRader之类的东东然后初始化一个文章实体类对象 Model.Article article = ... // ...是代码 - -! // 创建文章分类数据访问对象 Dal.ArticleCategory articleCategory = new Dal.ArticleCategory(); // 指定延时加载委托 article.CategoryLazyLoader = articleCategory.GetArticleCategoryById; // 返回文章对象 return article; }
通过上面方法得到的文章实体类对象中的Category属性就是实现了延时加载的了!
文章写得不短,不过说的东西很简单,细想起来几乎没什么内容,一句话就是使用委托预先得到一个用于获取文章分类的方法,在文章分类属性的get选择器中调用委托返回结果。好了,告诉负责编写UI层代码的同事,调用了业务逻辑层的方法去获取文章实体类对象吧,! 已经帮你把文章分类给封装加进去了,而且使用了延迟加载,怎么实现你就不用管,用就行了!于是这个人用的时候囧了,文章实体类对象里面有个委托...... 委托啊!!!干嘛用的!!!???啥意思!
先写到这里了,下一篇文章再说一些怎么隐藏这个委托,了解延迟加载的同学应该也想到方法了...
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
文章转载自:网络转载面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号