当前位置: 首页 > news >正文

浅谈C#中的延迟加载“.NET研究”(1)——善用委托

  很久以前就听过延迟加载这个东西,不过没有理解是什么意思,现在算是了解一二了,写点文章作为读书笔记,把自己的想法记录一下,希望对初学者帮助,不管是初学者或者高手如果发现文章那里写得不好或者有更好的思路和做法记得告诉我哦^^。文章打算写成两三篇,这个是第一篇。

  在三层结构中我们通常会使用多一个叫做模型层的东西,这一层中最主要做的事情是把数据库中的表 (或者其他数据源,例如xml或者自己定义的一种数据格式)转成对应的类,例如有一个文章表,这时候在这一层就会有一个文章类;文章类的属性对应着文章表的列,例如文章标题属性对应文章标题列。 实体类和数据表一一对应是最简单的情况,这时候实体类和实体类是各自独立存在的,没有出现相互引用的关系。 但是,几乎每一个数据库中的表都是存在关联关系的(关系型数据库),例如除了文章表之外,还会有一个文章分类表,假如说每一篇文章都必须属于一个分类,那么在数据库中表现出来的就是文章表中有一个外键字段指向文章分类表的主键 ,在C#代码中表示出来的是文章类中有一个属性(文章分类ID),通过这个属性我们就可以知道文章所属的分类、并且可以准确地通过代码查询数据库,获取一个文章分类实体类的对象,读取到文章所属分类的相关信息。

  以上的过程看起来一点问题都没有,整理一下思路,就是读取数据库,获取一个文章类对象,通过文字类对象中的文章分类ID的值,以这个值为查询条件去数据库中读取数据,获取一个文章分类对象,当然对数据库的操作我们通常 是封装在数据访问层中。然而从面向对象的角度考虑,我们会希望从文章类包含有文章分类的信息,用代码表示文章分类和文章两个实体类如下:

从上面的代码可以看到,在文章实体类中出现了一个Model.ArticleCategory类型的属性Category,我们想要的就是通过这个属性直接读取文章所属分类的详细信息。问题出现了,在数据库访问层中我们从数据库中读取数据去实例化一个文章实体类对象之后, 要选择在什么时候去给Category赋值

  • 选择一:立刻给通过分类ID(CategoryID属性)去获取所属文章分类的对象,然后塞给文章所属分类属性(Category) ,然后再返回文章对象。这种方法在有一点不好,就是万一得到文章对象之后根本不用去使用到Category属性显然这种做法不佳。
  • 选择二:在需要的时候再去读取文章分类,然后给文章类对象的Category属性赋值,但这和没有这个属性其实也没有什么区别。
  • 选择三:在Category属性的get访问器中实现读取数据库获取文章分类的代码,这样如果没有使用到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属性的数据进行延时加载呢?整理思路,根据需求一步步分析:

乍看起来似乎没问题,但要考虑一点,在三层结构中数据的传输靠的就是模型层,模型层处于三层之下,
上海网站建设v style="position: absolute; width: 1px; height: 1px; overflow: hidden; top: 1000px; left: -1000px;"> 换句话说,模型层不会去引用三层中的任何一层,而上面代码中的GetArticleCategoryByCategoryID很显然

转载于:https://www.cnblogs.com/waw/archive/2011/10/15/2213563.html

相关文章:

  • App-V 4.6 SP1系列之一安装
  • LightSwitch:小试一“.NET研究”下微软开发框架LightSwitch
  • 文本模板转换工具包和 ASP.NET MVC(摘)
  • 《CLR Via C# 第3版》笔记之(十六) - 字符串
  • JSTL 自定义
  • WIN7下使用Outlook访问 Exange2010 无法对外发送邮件的问题
  • linux下终止用户会话二法
  • REST与SOA两种架构下WCF的异同比较(含源码)
  • jquery特殊符号含意
  • Unix/Linux常用的一些命令--转贴我注明
  • 辅助域控制器删除报错“目标服务器无法分配标识符”
  • .NET Project Open Day(2011.11.13)
  • H3C交换机以太网端口类型
  • 遇事处理方式
  • phpweb解析不当加上传漏洞
  • GraphQL学习过程应该是这样的
  • JS基础之数据类型、对象、原型、原型链、继承
  • Linux快速复制或删除大量小文件
  • MD5加密原理解析及OC版原理实现
  • Python打包系统简单入门
  • ReactNative开发常用的三方模块
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • vue-cli3搭建项目
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 阿里云购买磁盘后挂载
  • 闭包,sync使用细节
  • 复杂数据处理
  • 今年的LC3大会没了?
  • 浅谈web中前端模板引擎的使用
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 深入 Nginx 之配置篇
  • 我们雇佣了一只大猴子...
  • #HarmonyOS:软件安装window和mac预览Hello World
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (13)Latex:基于ΤΕΧ的自动排版系统——写论文必备
  • (6)STL算法之转换
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)springboot电竞专题网站 毕业设计 641314
  • (数据结构)顺序表的定义
  • (原创) cocos2dx使用Curl连接网络(客户端)
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .NET 6 Mysql Canal (CDC 增量同步,捕获变更数据) 案例版
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET gRPC 和RESTful简单对比
  • .net6+aspose.words导出word并转pdf
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .NET学习全景图
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .sys文件乱码_python vscode输出乱码
  • /etc/fstab 只读无法修改的解决办法
  • /etc/sudoer文件配置简析
  • @ModelAttribute 注解
  • @RequestMapping处理请求异常
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题