使用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的情况下)获取到的 ...
随机推荐
- Oracle学习笔记:parallel并行处理
在使用oracel查询时,可以通过并行提高查询速度.例如: ) from table_name a; 强行启用并行度来执行当前SQL.加上这个说明之后,可以强行启用Oracle的多线程处理功能,提高效 ...
- 20155309南皓芯 实验2 Windows口令破解
在网络界,攻击事件发生的频率越来越高,其中相当多的都是由于网站密码泄露的缘故,或是人为因素导致,或是口令遭到破解,所以从某种角度而言,密码的安全问题不仅仅是技术上的问题,更主要的是人的安全意识问题. ...
- log4j记录日志到指定文件
新建类文件: import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigurator; /** * 记录日志到指定文件 ...
- MEF实现设计上的“松耦合”(一)
1.什么是MEF 先来看msdn上面的解释:MEF(Managed Extensibility Framework)是一个用于创建可扩展的轻型应用程序的库. 应用程序开发人员可利用该库发现并使用扩展, ...
- iOS开发之app打包发布流程
一.准备工作 苹果开发者中心 1.申请苹果开发者账号 首先需要申请苹果开发者账号才能在APP store 里发布应用. 开发者账号分类:(1)个人开发者账号 (2)企业开发者账号 主要的区别是:点击这 ...
- SpringBoot和微服务
SpringCloud SpringBoot 概念 应用 微服务CAP Consistency(数据强一致性),Availability(服务可用性),Partition-tolerance(分区容错 ...
- OpenJudge——0003:jubeeeeeat
OpenJudge——0003:jubeeeeeat 描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏.这是个音乐游戏,游戏界面是4×4的方阵,会根据音乐节奏要求玩家按下一些指定方块(以下称co ...
- eNSP仿真学习和VLAN配置
路由&交换机基本命令 sys #切换到系统视图(修改配置),Ctrl+Z 返回用户视图 sysname SW1 #设备重命名为SW1 int g0/0/1 #进入接口视图 VLAN配置 首先连 ...
- AORUS GA-Z270X-Gaming 5開箱
「AORUS」這個品牌名稱由埃及神祇荷魯斯(戰爭與狩獵之神)的名字衍生而成.荷魯斯通常被勾勒為獵鷹的形象,因此獵鷹的頭形被用作AORUS品牌的商標於2014年,本來只做為用在電競筆電及一些週邊方面,但 ...
- python通过swig调用静态库
swig - Simplified Wrapper and Interface Generator swig可以支持python,go,php,lua,ruby,c#等多种语言的包裹 本文主要记录如何 ...