之前的文章"浅谈C#中的延迟加载(1)——善用委托"中介绍了三层结构中在Model层对实体类的属性实现延迟加载的方法,该方法利用C#中的委托来实现,最后虽然延迟加载的目的得以实现,但是给客户端(例如UI层)暴露了不必要的属性(一个委托对象,我使用了泛型的Fun类来实现)。这篇文章介绍一种方法来隐藏这个属性,同时又可以达到延迟加载的目的,更重要的是这一切都是在之前的基础上来完成的,不需要改变原来使用到实体类的地方的代码。

  按照惯例,我们考虑一下想要我们的代码达到什么效果:首先在Model.Acticle(文章实体类)中的Category属性和原来一样,只在需要的时候通过调用委托来获取文章所属分类(Model.ArticleCategory类)。同时这个委托是不被客户端(例如UI层)代码看到的。。。设计模式中有一句话,大致的意思是通常在两个事物之间加上一个中间层,可以把事情变得简单,于是我们这样考虑,能不能加多一个中间层来实现呢?

  把Category属性定义为虚拟的(virtual),去掉委托,继承Model.Acticle类实现一个子类,把委托放到到这个子上海网站建设类里面来,由个子类里面去实现Category属性的get选择器,客户端访问的是一个用该子类做实例化的Model.Acticle类对象,这样一来客户端代码访问的依旧是Model.Acticle类,但是看不到用于实现延迟加载的委托却又能在Category属性中获取到需要的数据。呵呵,由于我是写文章的人,所以觉得这个思路很好理解,但是看文字的您可能感觉有点晕,下面用代码来说明应该就清楚了。

  首先我们修改Mode上海徐汇企业网站设计与制作l.Acticle类,给他瘦身,瘦身结果如下:

c#代码
// 文章实体类
  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; }
 // 文章所属分类
  public virtual Model.ArticleCategory Category
 {
get;
}
 }

  对比上一篇文章,可以发现作为延迟加载用的委托不见了,另外就是Category的get选择器中不再有任何逻辑代码,并且该属性被声明为virtual了。

  下一步我们创建多一层出来。新建一个名为DModel的类库(注意:该层需要引用Model层,然后被Dal层引用)。接下来在DModel层也创建一个Article类,没错!用他来继承Model.Acticle类。Dmodel.Acticle长成下面这个样子:

c#代码
 namespace DModel{
 // 文章 
public class Article : Model.Article
 {
 // 所属分类
 protected Model.ArticleCategory _category;
 public override 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; } }}

  是的,看到了么,委托跑这儿来了,并且他实现了Model.Acticle的Category属性的get选择器,里面的逻辑是不是也很熟悉呢。

  接着还有一个地方要做点小修改,就是Dal层中获取一个文章实体类的方法,也就是前一篇文章中写到的public Model.Article GetArticleById(int articleId)方法了,修改后如下:

c#代码
 // 根据文章ID获取文章实体类对象public Model.Article GetArticleById(int articleId){
 //上海闵行企业网站设计与制作 从数据库中取出数据,得到一个DateRow或者DateRader之类的东东然后初始化一个文章实体类对象
 DModel.Article article = ... // ...是代码 - -!
 // 创建文章分类数据访问对象
 Dal.ArticleCategory articleCategory =new Dal.ArticleCategory();
 // 指定延时加载委托
 article.CategoryLazyLoader = articleCategory.GetArticleCategoryById;
 // 返回文章对象
 return article;}

  请注意上面代码中这一句,DModel.Article article = ... // ...是代码 - -!,我们得到一个DModel.Article对象,最后以Model.Article的形式返回(C#中的装箱,是吧~)。再次告诉你的同事吧,你不用去管那个委托了,因为你现在拿到的Mode.Article对象中看不到那玩意,反正对你也没用。果然,看不见了,延迟加载的目的也达到鸟! 总结一下,本文讲的比前一篇文章讲的东西还少,主要记住三点: 1、把Category属性声明为虚拟的; 2、把Category原来的逻辑代码推迟到子类里面实现; 3、用子类(DModel.Acticle)实例话父类(Model.Acticle)。

  好了,用这个方法把项目里面类似Category这样的实体类属性修改为virtial吧,创建子类去重写它实现延迟加载,子类只有Dal层知道它的存在,Bll层和UI层对此一无所知,他们还是和原来一样用着,啥都不用修改,但是代码的效率明显有了提高,现在属性没有被使用就不会读取数据库了,数据库的压力也减少了^_^!!!

  这一切看起来似乎没问题,直到一个BUG被发现......在一个实体类中,有一个属性,按照之前的逻辑是我们给它赋值的时候,会对其他属性做相应的修改,现在给重写掉了,之前的逻辑,没拉.(待续)

浅谈C#中的延“.NET研究”迟加载(2)——善用virtual相关推荐

  1. python控制浏览器不上下滚动失灵_浅谈selenium如何应对网页内容需要鼠标滚动加载的问题...

    相信大家在selenium爬取网页的时候都遇到过这样的问题:就是网页内容需要用鼠标滚动加载剩余内容,而不是一次全部加载出网页的全部内容,这个时候如果要模拟翻页的时候就必须加载出全部的内容,不然定位元素 ...

  2. 计算机辅助药物设计 中药,浅谈计算机辅助药物设计在中药研究中的应用(1).pdf...

    文档介绍: · 前沿进展· 浅谈计算机辅助药物设计在中药研究中的应用巴真真, 于巍巍摇摇作者单位: 圆缘远远园猿山东省滨州市,滨州职业学院医疗学院摇摇[摘要]摇计算机辅助药物设计( 悦粤阅阅)的理论和 ...

  3. 计算机辅助药物设计 中药,浅谈计算机辅助药物设计在中药研究中的应用.pdf

    浅谈计算机辅助药物设计在中药研究中的应用.pdf 还剩 1页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: 戈HI心脑肺m管病杂志2012年1 JlJ第 ...

  4. 浅谈数据分析中的“暗物质”

    浅谈数据分析中的"暗物质" 我们分析数据,更重要的是看到数据中所隐藏的暗物质,即数据图中你看不见的数据\逻辑\知识. 开门见山,以下是某新闻媒体WAP\APP\PC三端的分周中和周 ...

  5. python文件路径拼接多出斜杠_浅谈python中拼接路径os.path.join斜杠的问题

    浅谈python中拼接路径os.path.join斜杠的问题 调试程序的过程中,发现通过os.path.join拼接的路径出现了反斜杠 directory1='/opt/apps/upgradePac ...

  6. 浅谈网络通信中的流量整形

    前言 在前面的<浅谈网络通信中的 ACK.NACK 和 REX>一文中,我们知道了网络通信中的丢包重传的相关理论和方法,既在网络发生丢包的情况下的补救措施,本文则往前进一步,介绍下如何通过 ...

  7. 视频基础知识:浅谈视频会议中H.264编码标准的技术发展

    浅谈视频会议中H.264编码标准的技术发展 浅谈视频会议中H.264编码标准的技术发展 数字视频技术广泛应用于通信.计算机.广播电视等领域,带来了会议电视.可视电话及数字电视.媒体存储等一系列应用,促 ...

  8. 浅谈产业界与学术界的合作研究(转)

    浅谈产业界与学术界的合作研究(转) [编者注:原文可参阅: http://blog.sciencenet.cn/blog-414166-795432.html ] 最近网络上有一个流传甚广的微故事:& ...

  9. aba会导致问题_浅谈Java中ABA问题及避免

    本文主要研究的是关于Java中ABA问题及避免的相关内容,具体如下. 在<Java并发实战>一书的第15章中有一个用原子变量实现的并发栈,代码如下: public class Node { ...

最新文章

  1. Atom编辑Markdown文件保存后行尾的空格自动消失的问题解决
  2. Java SPI机制分析
  3. Google Play
  4. 【报名】与阿里云一同探索视频云的新技术与新场景
  5. ViewPager+Fragment实现TabHost,Fragment动态添加、删除,Tab选项卡跟随滑动
  6. LCD也可以模拟?这款模拟器别错过了!
  7. 计算机网络之数据链路层:17、PPP协议、HDLC协议
  8. 补习系列(16)-springboot mongodb 数据库应用技巧
  9. java生成平滑散点图_【转载】如何在excel制作散点图平滑线散点图
  10. win7便笺重启计算机后还有吗,win7里的便签功能关机重启电脑后还有吗?
  11. apache maven安装教程
  12. SAP License:ML-物料分类账的未分配差异明细
  13. 字节跳动2020春招笔试 - 研发岗位(Java、C++、大数据)
  14. 我知道苏宁会玩,但没想到它能把“千人千面”玩到了极致
  15. 装机必备android东西nbsp;有你需…
  16. ubuntu 下浏览器中打开网页乱码解决
  17. HTML 利用 Web Audio API 进行音频可视化
  18. Ultraiso制作Centos7 优盘Udisk 启动镜像
  19. github本地项目上传到远程仓库
  20. Mysql 分库分表 Mycat

热门文章

  1. js excel 矫正
  2. birt报表数据只有一条_这个低代码报表开发平台,操作类似Excel,用好了不需要加班...
  3. android studio 便携式wlan热点 网络名称_手机移动网络共享,还可以这么玩,你知道吗?...
  4. Andorid AlertDialog 点击后自动消失_为何孙悟空成佛后,金箍儿就会自动消失?金箍儿究竟代表什么...
  5. 如何在本机安装mysql_机器人之如何在本机安装MySQL,并配置电脑为数据库服务器...
  6. html立方体旋转展开,css3技术设计立方体旋转发光效果动图
  7. asp.Net下短信猫发送短信中的中文乱码解决
  8. 基于隐马尔可夫模型的有监督词性标注
  9. php计算日期函数,php日期处理函数(计算时间差,转换时间戳日期)
  10. python层次聚类_python中做层次聚类,使用scipy.cluster.hierarchy.fclusterdata方法 | 学步园...