使用Lazy<T>实现对客户订单的延迟加载
"延迟加载"是指在需要的时候再加载数据。比如获得一个Customer信息,并不会把该Customer的Orders信息一下加载出来,当需要显示Orders的时候再加载。简单来说,就是按需加载。使用"延迟加载"的好处是减少应用程序响应时间,降低内存消耗,避免不必要的数据库交互。
□ 即时加载
创建Order类和Customer类,Customer中维护着Order的一个集合,在Customer的构造函数中给Order集合赋值。即,只要创建Customer实例,就会加载该Customer的所有Order。
关于Customer和Order类。
public class Customer{private List<Order> _orders = null;public List<Order> Orders{get { return _orders; }}private string _customerName;public string CustomerName{get { return _customerName; }set { CustomerName = value; }}public Customer(){_customerName = "darren";_orders = LoadOrders();}private List<Order> LoadOrders(){List<Order> result = new List<Order>();Order o = new Order();o.OrderNumber = "001";result.Add(o);o = new Order();o.OrderNumber = "002";result.Add(o);return result;}}public class Order{private string _orderNumber;public string OrderNumber{get { return _orderNumber; }set { _orderNumber = value; }}}
客户端调用:
class Program{static void Main(string[] args){Customer customer = new Customer();Console.WriteLine(customer.CustomerName);foreach (var order in customer.Orders){Console.WriteLine(order.OrderNumber);}Console.ReadKey();}}
把断点打在foreach所在行,为customer变量添加监视, 就发现:在创建Customer实例的同时,加载了该Customer的所有Order。
□ Lazy<T>实现延迟加载
对于延迟加载,在这里,需求变成:在创建Customer实例的时候先不要加载该Customer的任何Order,等到遍历、显示Orders的时候再加载该Customer的所有的Order。
把Customer的_orders字段设置为验证加载。
private Lazy<List<Order>> _orders = null;
Customer的Orders属性的get访问器中修改如下。
public List<Order> Orders{get { return _orders.Value; }}
构造函数中修改如下:
public Customer(){_customerName = "darren";_orders = new Lazy<List<Order>>(() => LoadOrders());}
Customer类,修改后,完整如下:
public class Customer{private Lazy<List<Order>> _orders = null;public List<Order> Orders{get { return _orders.Value; }}private string _customerName;public string CustomerName{get { return _customerName; }set { CustomerName = value; }}public Customer(){_customerName = "darren";_orders = new Lazy<List<Order>>(() => LoadOrders());}private List<Order> LoadOrders(){List<Order> result = new List<Order>();Order o = new Order();o.OrderNumber = "001";result.Add(o);o = new Order();o.OrderNumber = "002";result.Add(o);return result;}}
还是把断点打在客户端foreach代码行,运行。
可见,在没有遍历之前,Customer的_orders字段的Value属性值为null。
F11,进入循环遍历
可见,当进入遍历,获取Customer实例的Order值的时候,延迟加载开始,_orders字段的属性值不再为null。
总结:当我们希望类的某个属性实现延迟加载,首先设计一个Lazy<T>类型的字段,然后在该属性的get访问器中,通过Lazy<T>类型字段的Value属性获取值,最后在该类构造函数中实现针对Lazy<T>类型字段的初始化。
使用Lazy<T>实现对客户订单的延迟加载的更多相关文章
- 有两张表;使用SQL查询,查询所有的客户订单日期最新的前五条订单记录。
客户信息表(c CUSTOM)有以下字段:id.name.mobile 客户订单表(C_ORDER)有以下字段:id.custom_id.commodity.count.order _date Sel ...
- erp中三大订单CO、PO、MO各是代表什么?
ERP即 企业资源计划 (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出. ERP系统是指建立在信息技术基础上,以系统化的管理思想 ...
- 深信服模式(先做减法,必须拜访客户三次、研究需求方向,把产品的问题控制住,快速反应,在未来十年,绝大部分业务都会搬到Internet上来,实现All on Internet)good
深圳市盛凯信息科技有限公司与深信服合作多年,可以说是看着深信服“飞速”长大的.盛凯的总经理邓渊在采访中笑言:“他们(深信服)发展得太快,而我们发展得太慢.” 深信服的产品线已从最初只有VPN一条,到目 ...
- Lazy<T>
Lazy<T> 对象的创建方式,始终代表了软件工业的生产力方向,代表了先进软件技术发展的方向,也代表了广大程序开发者的集体智慧.以new的方式创建,通过工厂方法,利用IoC容器,都以不同的 ...
- 1.1XAF框架开发视频教程-简单的订单管理实现过程,视频,提纲,及教程源码
下面是视频教程的提纲: PPT版本的提纲下载 本节源码下载 XAF框架开发教程 快速实现企业级信息系统开发的利器 XAF简介 ´ 开发公司:www.devexpress.com,老牌控件公司 ´ ...
- erp中三大订单CO、PO、MO
ERP即 企业资源计划 (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出. ERP系统是指建立在信息技术基础上,以系统化的管理思想 ...
- Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍
本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...
- 类图示例-订单系统 / Class Diagram - Order System
类图示例-订单系统 / Class Diagram - Order System 什么是类图? 类图通过显示它的类和它们之间的关系来概述系统.类图是静态的 - 它们显示交互的内容,但不显示交互时会发生 ...
- Hibernate之lazy延迟加载
一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...
随机推荐
- 使用mockito模拟静态方法
一.为什么要使用Mock工具 在做单元测试的时候,我们会发现我们要测试的方法会引用很多外部依赖的对象,比如:(发送邮件,网络通讯,远程服务, 文件系统等等). 而我们没法控制这些外部依赖的对象,为了解 ...
- iOS图片缓存
iOS的内存管理始终是开发者面临的大问题,内存占用过大时,很容易会被系统kill掉,开发者需要尽可能的优化内存占用问题. 现在的App界面做的越来越精致,里面集成了大量的图片,笔者首先想到的就是如何减 ...
- 第六届CCF软件能力认证
1.数位之和 问题描述 给定一个十进制整数n,输出n的各位数字之和. 输入格式 输入一个整数n. 输出格式 输出一个整数,表示答案. 样例输入 20151220 样例输出 13 样例说明 201512 ...
- 微信小程序-视频教程-百度云-下载
链接: https://pan.baidu.com/s/16WGL3whutozx-UXqsDPhhA 提取码: 关注公众号[GitHubCN]回复获取 什么是微信小程序?小程序是一种不需要下载安 ...
- centos7 关闭默认firewalld,开启iptables
编者按: 对于使用了centos6系列系统N年的运维来说,在使用centos7的时候难免会遇到各种不适应.比如防火墙问题.本文主要记录怎么关闭默认的firewalld防火墙,重新启用iptables. ...
- echarts3.0 本期累计堆叠
@{ ViewBag.Title = "barlj"; } <h2>barlj</h2> <div id="main" style ...
- 黑马程序员_java基础笔记(10)...JDK1.5的新特性
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— 1:静态导入.2:for—each循环.3:自动装箱/拆箱.4:可变参数.5:枚举 ...
- poi类包对比
- 大数据技术之_13_Azkaban学习_Azkaban(阿兹卡班)介绍 + Azkaban 安装部署 + Azkaban 实战
一 概述1.1 为什么需要工作流调度系统1.2 常见工作流调度系统1.3 各种调度工具特性对比1.4 Azkaban 与 Oozie 对比二 Azkaban(阿兹卡班) 介绍三 Azkaban 安装部 ...
- eclipse使用小技巧
1.eclipse中SVN无版本信息显示,window-preference-general-appeerance-label decoration-svn勾上,显示有关项目中受 SVN 控制的资源的 ...