首页 > 其他分享 >CSharp: Lazy Load Pattern in donet core 6

CSharp: Lazy Load Pattern in donet core 6

时间:2023-01-24 16:55:08浏览次数:52  
标签:Load core Lazy Pattern System using public

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Geovin.Du.DuLazyLoad.DuGhosts
{

    /// <summary>
    /// Lazy Load Pattern
    /// </summary>
    public enum LoadStatus
    {
        /// <summary>
        /// 无加载
        /// </summary>
        Unloaded,
        /// <summary>
        /// 正加哉
        /// </summary>
        Loading,
        /// <summary>
        /// 已加载
        /// </summary>
        Loaded,
    }

}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Geovin.Du.DuLazyLoad.DuGhosts
{

    /// <summary>
    /// Lazy Load Pattern
    /// </summary>
    public class GhostCollege : DomainObject
    {
        private string? _missionStatement;
        private int? _numberOfStudents;
        private Library? _library;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        public GhostCollege(int id)
            : base(id)
        {
            Id = id;
            Console.WriteLine("学院初始化完成.");
        }
        /// <summary>
        /// 
        /// </summary>
        public string MissionStatement
        {
            get
            {
                LoadIfNecessary();
                return _missionStatement!;
            }
            set => _missionStatement = value;
        }
        /// <summary>
        /// 
        /// </summary>
        public int NumberOfStudents
        {
            get
            {
                LoadIfNecessary();
                return _numberOfStudents!.Value;
            }
            set => _numberOfStudents = value;
        }
        /// <summary>
        /// 
        /// </summary>
        public Library Library
        {
            get
            {
                LoadIfNecessary();
                return _library!;
            }
            set => _library = value;
        }
        /// <summary>
        /// 
        /// </summary>
        public void ShowDetails() =>
            Console.WriteLine(
                $"大学的使命是: '{MissionStatement}'.\n" +
                $"这所学院图书馆拥有藏书 {Library.NumberOfBooks} 册, " +
                $"成立于 {Library.EstablishmentDate.ToShortDateString()}.");
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        protected override object[] FetchData() =>
            new object[3]
            {
            "学习、发现、治愈、创造,让世界变得更美好",
            850,
            new Library(),
            };
        /// <summary>
        /// 
        /// </summary>
        /// <param name="dataRow"></param>
        protected override void ApplyLoadedData(object[] dataRow)
        {
            Console.WriteLine("数据加载中...");

            _missionStatement = (string)dataRow[0];
            _numberOfStudents = (int)dataRow[1];
            _library = (Library)dataRow[2];
        }
    }

}


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Geovin.Du.DuLazyLoad.DuGhosts
{

    /// <summary>
    /// Lazy Load Pattern
    /// </summary>
    public abstract class DomainObject
    {
        private LoadStatus _status;
        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        protected DomainObject(int id)
        {
            Id = id;
        }

        public int Id { get; init; }
        public bool IsGhost => _status == LoadStatus.Unloaded;
        public bool IsLoaded => _status == LoadStatus.Loaded;

        /// <summary>
        /// Note template method pattern.
        /// </summary>
        public virtual void LoadIfNecessary()
        {
            if (!IsGhost)
            {
                return;
            }

            var dataRow = FetchData();

            MarkAsLoading();
            ApplyLoadedData(dataRow);
            MarkAsLoaded();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        protected abstract object[] FetchData();
        /// <summary>
        /// 
        /// </summary>
        /// <param name="dataRow"></param>
        protected abstract void ApplyLoadedData(object[] dataRow);
        /// <summary>
        /// 
        /// </summary>
        private void MarkAsLoading() => _status = LoadStatus.Loading;
        /// <summary>
        /// 
        /// </summary>
        private void MarkAsLoaded() => _status = LoadStatus.Loaded;
    }

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Geovin.Du.DuLazyLoad.DuGhosts
{

    /// <summary>
    /// Lazy Load Pattern
    /// </summary>
    public class CollegeFactory
    {

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public GhostCollege CreateFromId(int id) => new(id);
    }

}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Geovin.Du.BuildingBlocks;


namespace Geovin.Du.DuLazyLoad.DuGhosts
{

    /// <summary>
    /// Lazy Load Pattern
    /// </summary>
    public static class GhostsExecutor
    {

        /// <summary>
        /// 
        /// </summary>
        public static void Execute()
        {
            ConsoleExtension.WriteSeparator("Lazy Load Pattern:Ghosts demo");

            var collegeFactory = new CollegeFactory();
            var college = collegeFactory.CreateFromId(1);

            // College library shouldn't have been constructed before calling ShowDetails method.
            Console.WriteLine("给我更多关于这所大学的细节!");
            college.ShowDetails();

            Console.WriteLine("\n给我更多关于这所大学的细节!");
            college.ShowDetails();
        }
    }
}

  

调用:

Geovin.Du.DuLazyLoad.DuGhosts.GhostsExecutor.Execute();

  

输出:

Lazy Load Pattern:Ghosts demo
--------------------------------------------------
学院初始化完成.
给我更多关于这所大学的细节!
加载库...
数据加载中...
大学的使命是: '学习、发现、治愈、创造,让世界变得更美好'.
这所学院图书馆拥有藏210000册 ,成立于 2008/5/28.

给我更多关于这所大学的细节!
大学的使命是: '学习、发现、治愈、创造,让世界变得更美好'.
这所学院拥有图书馆210000 书 和 成立于 2008/5/28.

  

 

标签:Load,core,Lazy,Pattern,System,using,public
From: https://www.cnblogs.com/geovindu/p/17066173.html

相关文章

  • Spark Core-第三章:RDD的持久化
    Spark是大数据体系的明星产品,是一款高性能的分布式内存迭代计算框架,可以处理海量规模的数据。下面就带大家来学习今天的内容!一、RDD的数据是过程数据二、RDD的缓存三、RDD......
  • .NET Core 、 .NET 5、.NET 6和.NET 7 简介及区别
    .NET是一种用于构建多种应用的免费开源开发平台,可以使用多种语言,编辑器和库开发Web应用、WebAPI和微服务、云中的无服务器函数、云原生应用、移动应用、桌面应用、Windows......
  • coredns mysql 扩展使用+readyset 试用
    基于db进行dns记录的管理还是比较有用的,尤其在一些开发环境中,以下是一个使用同时也会尝试集成readyset(但是木有成功,应该是mysql编码兼容的问题)添加&构建插件方法比......
  • 【ASP.NET Core】用配置文件来设置授权角色
    在开始之前,老周先祝各个次元的伙伴们新春快乐、生活愉快、万事如意。在上一篇水文中,老周介绍了角色授权的一些内容。本篇咱们来聊一个比较实际的问题——把用于授权的角色......
  • nginx http2 导致safari浏览器XMLHttpRequest cannot load错误
    环境说明nginx:1.22.0safari:13+curl:7.68.0ubuntu:20.04问题说明[Error]Thenetworkconnectionwaslost.[Error]XMLHttpRequestcannotloadxxxduetoaccesscon......
  • 第10章 带有依赖注入的服务配置(ASP.NET Core in Action, 2nd Edition)
    第2部分构建完整的应用程序我们在第一部分中讨论了很多内容。您看到了ASP.NETCore应用程序是如何由中间件组成的,我们主要关注RazorPages框架。您了解了如何使用Razor语......
  • Ucore_lab4相关
    实验指导书:https://learningos.github.io/ucore_os_webdocs/lab4/lab4_3_1_lab_steps.html优秀的博客:https://kiprey.github.io/2020/08/uCore-4/内核线程管理关键结......
  • Ucore_lab3相关
    优秀的博客:https://kiprey.github.io/2020/08/uCore-3/实验指导书:https://learningos.github.io/ucore_os_webdocs/lab3.html虚拟内存管理关键的一些结构:structvma......
  • Ucore_lab2相关
    优秀的博客:https://kiprey.github.io/2020/08/uCore-2/ 实验书:https://learningos.github.io/ucore_os_webdocs/lab1/lab1_2_1_exercise.html 物理内存管理启动分......
  • cpp operator = aka assignment operator overload
    //model/book.cppvoidbook::operator=(constbook&bk){std::cout<<std::endl<<std::endl<<std::endl<<"Calledoperatorassignmentoverloaded!"<<std::end......