"延迟加载"是指在需要的时候再加载数据。比如获得一个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>实现对客户订单的延迟加载的更多相关文章

  1. 有两张表;使用SQL查询,查询所有的客户订单日期最新的前五条订单记录。

    客户信息表(c CUSTOM)有以下字段:id.name.mobile 客户订单表(C_ORDER)有以下字段:id.custom_id.commodity.count.order _date Sel ...

  2. erp中三大订单CO、PO、MO各是代表什么?

    ERP即 企业资源计划 (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出. ERP系统是指建立在信息技术基础上,以系统化的管理思想 ...

  3. 深信服模式(先做减法,必须拜访客户三次、研究需求方向,把产品的问题控制住,快速反应,在未来十年,绝大部分业务都会搬到Internet上来,实现All on Internet)good

    深圳市盛凯信息科技有限公司与深信服合作多年,可以说是看着深信服“飞速”长大的.盛凯的总经理邓渊在采访中笑言:“他们(深信服)发展得太快,而我们发展得太慢.” 深信服的产品线已从最初只有VPN一条,到目 ...

  4. Lazy<T>

    Lazy<T> 对象的创建方式,始终代表了软件工业的生产力方向,代表了先进软件技术发展的方向,也代表了广大程序开发者的集体智慧.以new的方式创建,通过工厂方法,利用IoC容器,都以不同的 ...

  5. 1.1XAF框架开发视频教程-简单的订单管理实现过程,视频,提纲,及教程源码

    下面是视频教程的提纲: PPT版本的提纲下载 本节源码下载 XAF框架开发教程 快速实现企业级信息系统开发的利器 XAF简介 ´  开发公司:www.devexpress.com,老牌控件公司 ´  ...

  6. erp中三大订单CO、PO、MO

    ERP即 企业资源计划 (Enterprise Resource Planning),由美国 Gartner Group 公司于1990年提出. ERP系统是指建立在信息技术基础上,以系统化的管理思想 ...

  7. Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍

    本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...

  8. 类图示例-订单系统 / Class Diagram - Order System

    类图示例-订单系统 / Class Diagram - Order System 什么是类图? 类图通过显示它的类和它们之间的关系来概述系统.类图是静态的 - 它们显示交互的内容,但不显示交互时会发生 ...

  9. Hibernate之lazy延迟加载

    一.延迟加载的概念 当Hibernate从数据库中加载某个对象时,不加载关联的对象,而只是生成了代理对象,获取使用session中的load的方法(在没有改变lazy属性为false的情况下)获取到的 ...

随机推荐

  1. java 多线程总结篇4——锁机制

    在开发Java多线程应用程序中,各个线程之间由于要共享资源,必须用到锁机制.Java提供了多种多线程锁机制的实现方式,常见的有synchronized.ReentrantLock.Semaphore. ...

  2. (转载)solr实现满足指定距离范围条件的搜索

    配置schema.xml <?xml version="1.0" encoding="UTF-8" ?> <schema name=" ...

  3. 【读书笔记】Android的Ashmem机制学习

    Ashmem是安卓在linux基础上添加的驱动模块,就是说安卓有linux没有的功能. Ashmem模块在内核层面上实现,在运行时库和应用程序框架层提供了访问接口.在运行时库层提供的是C++接口,在应 ...

  4. Struts DispatchAction Example

    The DispatchAction class (org.apache.struts.actions.DispatchAction) provides a way to group all rela ...

  5. 《精通Python设计模式》学习结构型之享元模式

    这个我日常当中也没有用到过, 真的是游戏行业用得多些? 学习一下, 有个印象. import random from enum import Enum TreeType = Enum('TreeTye ...

  6. USACO 4.2 Job Processing

    Job ProcessingIOI'96 A factory is running a production line that requires two operations to be perfo ...

  7. 黑马程序员_java基础笔记(08)...GUI,网络编程,正则表达式

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— GUI(Graphical User Interface)(图形用户接口):用图形 ...

  8. [js]事件篇

    一.事件流 1.冒泡事件:从特定的事件到不特定事件依次触发:(由DOM层次的底层依次向上冒泡) (1)示例: <html onclick="add('html<br>')& ...

  9. Android IntentService

    IntentService简要分析 IntentService 继承自 android.app.Service.内部实现极其简单. 首先在 onCreate()中去开启了一个 HandlerThrea ...

  10. Tkinter制作简单的python编辑器

    想要制作简单的python脚本编辑器,其中文字输入代码部分使用Tkinter中的Text控件即可实现. 但是问题是,如何实现高亮呢?参考python自带的编辑器:python27/vidle文件夹中的 ...