CSharp: Memento Pattern

项目结构:

image

 

/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : ConcurrentSafeHelper.cs
*/

using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Common
{
    /// <summary>
    /// 线程安全通用工具类
    /// 封装读写分离锁、安全读写方法,全局复用,统一并发管控规范
    /// </summary>
    public static class ConcurrentSafeHelper
    {
        /// <summary>
        /// 创建无递归读写分离锁,推荐读多写少场景使用
        /// </summary>
        /// <returns>读写锁实例</returns>
        public static ReaderWriterLockSlim CreateReadWriteLock()
        {
            return new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
        }

        /// <summary>
        /// 线程安全执行写入操作
        /// </summary>
        /// <param name="rwLock">读写锁对象</param>
        /// <param name="writeAction">待执行写入逻辑</param>
        public static void SafeWrite(ReaderWriterLockSlim rwLock, Action writeAction)
        {
            if (rwLock == null || writeAction == null)
                return;
            rwLock.EnterWriteLock();
            try
            {
                writeAction.Invoke();
            }
            finally
            {
                rwLock.ExitWriteLock();
            }
        }

        /// <summary>
        /// 线程安全执行无返回值读取操作
        /// </summary>
        /// <param name="rwLock">读写锁对象</param>
        /// <param name="readAction">读取逻辑</param>
        public static void SafeRead(ReaderWriterLockSlim rwLock, Action readAction)
        {
            if (rwLock == null || readAction == null)
                return;
            rwLock.EnterReadLock();
            try
            {
                readAction.Invoke();
            }
            finally
            {
                rwLock.ExitReadLock();
            }
        }

        /// <summary>
        /// 线程安全读取带返回值泛型方法
        /// </summary>
        /// <typeparam name="T">返回值类型</typeparam>
        /// <param name="rwLock">读写锁</param>
        /// <param name="readFunc">读取委托</param>
        /// <returns>读取结果</returns>
        public static T SafeRead<T>(ReaderWriterLockSlim rwLock, Func<T> readFunc)
        {
            if (rwLock == null || readFunc == null)
                return default;
            rwLock.EnterReadLock();
            try
            {
                return readFunc.Invoke();
            }
            finally
            {
                rwLock.ExitReadLock();
            }
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : GlobalConfig.cs
*/

using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Common
{
    /// <summary>
    /// 全局静态统一配置类
    /// 集中管理日志路径、格式化模板、系统常量,统一修改便于扩展维护
    /// </summary>
    public static class GlobalConfig
    {
        #region 日志路径与格式化常量
        /// <summary>
        /// 日志根文件夹名称
        /// </summary>
        public const string LogRootDirectory = "Logs";

        /// <summary>
        /// 日期文件夹格式化模板,生成如 2026-08-05
        /// </summary>
        public const string LogDayFolderFormat = "{0:yyyy-MM-dd}";

        /// <summary>
        /// 日志文件模板:app-{Level}.log,自动拆分debug/info/warn/error
        /// </summary>
        public const string LogFileNameTemplate = "app-{Level}.log";

        /// <summary>
        /// 日志时间戳格式化模板,精确到毫秒
        /// </summary>
        public const string LogTimeFormat = "yyyy-MM-dd HH:mm:ss.fff";
        #endregion

        #region 系统业务常量
        /// <summary>
        /// 珠宝业务编号前缀
        /// </summary>
        public const string BusinessSnPrefix = "JEW-ENTER-";

        /// <summary>
        /// 系统全局最低日志级别
        /// </summary>
        public static Microsoft.Extensions.Logging.LogLevel GlobalMinLogLevel
            = Microsoft.Extensions.Logging.LogLevel.Debug;
        #endregion
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : BaseMemento.cs
*/
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Core.Base
{
    /// <summary>
    /// 备忘录模式顶层抽象快照基类
    /// 定义所有快照通用基础属性,后续任意业务快照可继承扩展
    /// </summary>
    public abstract class BaseMemento
    {
        /// <summary>
        /// 快照创建时间
        /// </summary>
        public DateTime CreateTime { get; }

        /// <summary>
        /// 业务唯一编号
        /// </summary>
        public string BusinessSn { get; }

        /// <summary>
        /// 基础快照构造初始化
        /// </summary>
        /// <param name="businessSn">业务唯一编号</param>
        protected BaseMemento(string businessSn)
        {
            BusinessSn = businessSn;
            CreateTime = DateTime.Now;
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : BaseService.cs
*/

using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Core.Base
{
    /// <summary>
    /// 所有业务服务、调度器、模式类统一父基类
    /// 强制子类注入ILogger<T>,全局统一日志依赖,规范编码结构
    /// </summary>
    /// <typeparam name="T">当前子类自身类型</typeparam>
    public abstract class BaseService<T>
    {
        /// <summary>
        /// 当前类专属日志实例,子类直接使用输出日志
        /// </summary>
        protected readonly ILogger<T> Logger;

        /// <summary>
        /// 构造函数强制注入日志对象
        /// </summary>
        /// <param name="logger">ILogger<T>日志实例</param>
        protected BaseService(ILogger<T> logger)
        {
            Logger = logger;
        }
    }
}

/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : LoggerBuildFactory.cs
*/

using Karambolo.Extensions.Logging.File;
using MementoPattern.Common;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;

namespace MementoPattern.Core.Logging
{
    /// <summary>
    /// 日志构建工厂类
    /// 统一初始化控制台+分级文件日志,实现按日期文件夹、日志等级拆分文件、高并发锁写入
    /// </summary>
    public static class LoggerBuildFactory
    {
        /// <summary>
        /// 全局日志统一初始化方法
        /// </summary>
        /// <param name="loggingBuilder">宿主日志构建器</param>
        public static void BuildGlobalLogger(ILoggingBuilder loggingBuilder)
        {
            // 清空默认日志,完全自定义日志规则
            loggingBuilder.ClearProviders();

            #region 1、注册控制台日志
            loggingBuilder.AddSimpleConsole(options =>
            {
                options.TimestampFormat = GlobalConfig.LogTimeFormat;
                options.IncludeScopes = true;
                options.SingleLine = false;
            });
            #endregion

            #region 2、注册分级文件日志(按日期文件夹、等级拆分文件,使用 Karambolo 4.x API)
            string todayDate = DateTime.Now.ToString("yyyy-MM-dd");
            string logRootPath = Path.Combine(Directory.GetCurrentDirectory(), GlobalConfig.LogRootDirectory);

            loggingBuilder.AddFile(fileBuilder =>
            {
                fileBuilder.RootPath = logRootPath;
                fileBuilder.Files = new[]
                {
                    new LogFileOptions
                    {
                        Path = $"{todayDate}/app-debug.log",
                        MinLevel = new Dictionary<string, LogLevel> { [""] = LogLevel.Debug },
                        MaxFileSize = 100 * 1024 * 1024
                    },
                    new LogFileOptions
                    {
                        Path = $"{todayDate}/app-info.log",
                        MinLevel = new Dictionary<string, LogLevel> { [""] = LogLevel.Information },
                        MaxFileSize = 100 * 1024 * 1024
                    },
                    new LogFileOptions
                    {
                        Path = $"{todayDate}/app-warn.log",
                        MinLevel = new Dictionary<string, LogLevel> { [""] = LogLevel.Warning },
                        MaxFileSize = 100 * 1024 * 1024
                    },
                    new LogFileOptions
                    {
                        Path = $"{todayDate}/app-error.log",
                        MinLevel = new Dictionary<string, LogLevel> { [""] = LogLevel.Error },
                        MaxFileSize = 100 * 1024 * 1024
                    }
                };
            });
            #endregion

            #region 3、全局日志过滤配置
            loggingBuilder.SetMinimumLevel(GlobalConfig.GlobalMinLogLevel);
            // 过滤系统框架冗余日志
            loggingBuilder.AddFilter("Microsoft", LogLevel.Warning);
            loggingBuilder.AddFilter("System", LogLevel.Warning);
            loggingBuilder.AddFilter("Microsoft.Hosting", LogLevel.Information);
            loggingBuilder.AddFilter("Microsoft.Extensions", LogLevel.Warning);
            #endregion
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : LogUniformFormatter.cs
*/

using MementoPattern.Common;
using Microsoft.Extensions.Logging.Console;
using System;

namespace MementoPattern.Core.Logging
{
    /// <summary>
    /// 统一日志格式化提供器
    /// 严格保证控制台日志、文件日志格式100%完全一致
    /// </summary>
    public static class LogUniformFormatter
    {
        /// <summary>
        /// 获取控制台日志格式化配置,与文件对齐
        /// </summary>
        /// <returns>控制台格式化参数</returns>
        public static ConsoleFormatterOptions GetConsoleFormatterOptions()
        {
            return new ConsoleFormatterOptions
            {
                TimestampFormat = GlobalConfig.LogTimeFormat,
                IncludeScopes = true
            };
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : BusinessOriginator.cs
*/
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Pattern.Memento
{
    /// <summary>
    /// 备忘录原发器:持有全业务运行状态
    /// 负责生成快照、快照回滚恢复业务历史状态
    /// </summary>
    public class BusinessOriginator : BaseService<BusinessOriginator>
    {
        #region 业务运行状态字段
        /// <summary>
        /// 当前业务编号
        /// </summary>
        public string CurrentBusinessSn { get; set; } = string.Empty;

        /// <summary>
        /// 当前原料名称
        /// </summary>
        public string CurrentMaterial { get; set; } = string.Empty;

        /// <summary>
        /// 当前原料重量
        /// </summary>
        public decimal CurrentWeight { get; set; }

        /// <summary>
        /// 当前图纸内容
        /// </summary>
        public string CurrentDesign { get; set; } = string.Empty;

        /// <summary>
        /// 当前加工工艺
        /// </summary>
        public string CurrentCraft { get; set; } = string.Empty;

        /// <summary>
        /// 当前质检分数
        /// </summary>
        public decimal CurrentScore { get; set; }

        /// <summary>
        /// 当前财务金额
        /// </summary>
        public decimal CurrentAmount { get; set; }
        #endregion

        /// <summary>
        /// 构造注入日志
        /// </summary>
        /// <param name="logger">日志实例</param>
        public BusinessOriginator(ILogger<BusinessOriginator> logger) : base(logger)
        {
        }

        /// <summary>
        /// 根据当前实时业务状态生成快照
        /// </summary>
        /// <returns>业务快照对象</returns>
        public JewelryBusinessMemento CreateMemento()
        {
            Logger.LogDebug("【快照生成】业务编号:{Sn},记录当前全流程业务状态", CurrentBusinessSn);
            JewelryBusinessMemento memento = new JewelryBusinessMemento(
                CurrentBusinessSn, CurrentMaterial, CurrentWeight,
                CurrentDesign, CurrentCraft, CurrentScore, CurrentAmount);
            return memento;
        }

        /// <summary>
        /// 使用历史快照回滚业务状态
        /// </summary>
        /// <param name="memento">待恢复快照</param>
        public void RestoreMemento(JewelryBusinessMemento memento)
        {
            if (memento == null)
            {
                Logger.LogWarning("快照为空,无法执行回滚操作");
                return;
            }
            CurrentBusinessSn = memento.BusinessSn;
            CurrentMaterial = memento.MaterialName;
            CurrentWeight = memento.MaterialWeight;
            CurrentDesign = memento.DesignContent;
            CurrentCraft = memento.CraftType;
            CurrentScore = memento.QualityScore;
            CurrentAmount = memento.FinanceAmount;
            Logger.LogInformation("【业务回滚成功】{Sn}已恢复至{Time}历史快照", CurrentBusinessSn, memento.CreateTime);
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : JewelryBusinessMemento.cs
*/

using MementoPattern.Core.Base;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Pattern.Memento
{
    /// <summary>
    /// 珠宝全业务快照实体
    /// 存储原料、设计、加工、质检、财务等全流程业务状态,用于版本回滚、历史存档
    /// </summary>
    public class JewelryBusinessMemento : BaseMemento
    {
        /// <summary>
        /// 原料名称
        /// </summary>
        public string MaterialName { get; }

        /// <summary>
        /// 原料重量(g)
        /// </summary>
        public decimal MaterialWeight { get; }

        /// <summary>
        /// 设计图纸文案内容
        /// </summary>
        public string DesignContent { get; }

        /// <summary>
        /// 加工工艺类型
        /// </summary>
        public string CraftType { get; }

        /// <summary>
        /// 成品质检分数
        /// </summary>
        public decimal QualityScore { get; }

        /// <summary>
        /// 本次业务财务金额
        /// </summary>
        public decimal FinanceAmount { get; }

        /// <summary>
        /// 构造快照对象,记录全业务状态
        /// </summary>
        /// <param name="businessSn">业务编号</param>
        /// <param name="materialName">原料名称</param>
        /// <param name="materialWeight">原料重量</param>
        /// <param name="designContent">图纸内容</param>
        /// <param name="craftType">加工工艺</param>
        /// <param name="qualityScore">质检分数</param>
        /// <param name="financeAmount">财务金额</param>
        public JewelryBusinessMemento(string businessSn, string materialName, decimal materialWeight,
            string designContent, string craftType, decimal qualityScore, decimal financeAmount)
            : base(businessSn)
        {
            MaterialName = materialName;
            MaterialWeight = materialWeight;
            DesignContent = designContent;
            CraftType = craftType;
            QualityScore = qualityScore;
            FinanceAmount = financeAmount;
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : MementoCaretaker.cs
*/
using MementoPattern.Common;
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Pattern.Memento
{
    /// <summary>
    /// 快照保管员:统一存储、查询、管理所有业务快照
    /// 读写分离锁保证高并发线程安全
    /// </summary>
    public class MementoCaretaker : BaseService<MementoCaretaker>
    {
        /// <summary>
        /// 读写分离锁,管控快照集合并发读写
        /// </summary>
        private readonly ReaderWriterLockSlim _rwLock;

        /// <summary>
        /// 内存快照仓库
        /// </summary>
        private readonly List<JewelryBusinessMemento> _mementoStore;

        /// <summary>
        /// 构造初始化锁与仓库
        /// </summary>
        /// <param name="logger">日志实例</param>
        public MementoCaretaker(ILogger<MementoCaretaker> logger) : base(logger)
        {
            _rwLock = ConcurrentSafeHelper.CreateReadWriteLock();
            _mementoStore = new List<JewelryBusinessMemento>();
        }

        /// <summary>
        /// 新增快照入库(独占写锁)
        /// </summary>
        /// <param name="memento">快照对象</param>
        public void AddMemento(JewelryBusinessMemento memento)
        {
            if (memento == null)
            {
                Logger.LogWarning("待入库快照为空,入库失败");
                return;
            }
            ConcurrentSafeHelper.SafeWrite(_rwLock, () =>
            {
                _mementoStore.Add(memento);
            });
            Logger.LogDebug("快照仓库新增业务[{Sn}]历史版本", memento.BusinessSn);
        }

        /// <summary>
        /// 根据业务编号查询全部历史快照,时间倒序
        /// </summary>
        /// <param name="businessSn">业务编号</param>
        /// <returns>快照集合</returns>
        public List<JewelryBusinessMemento> GetAllHistory(string businessSn)
        {
            return ConcurrentSafeHelper.SafeRead(_rwLock, () =>
            {
                return _mementoStore
                    .Where(x => x.BusinessSn == businessSn)
                    .OrderByDescending(x => x.CreateTime)
                    .ToList();
            });
        }

        /// <summary>
        /// 获取指定业务最新快照
        /// </summary>
        /// <param name="businessSn">业务编号</param>
        /// <returns>最新快照,无则null</returns>
        public JewelryBusinessMemento? GetLatestMemento(string businessSn)
        {
            return ConcurrentSafeHelper.SafeRead(_rwLock, () =>
            {
                return _mementoStore
                    .Where(x => x.BusinessSn == businessSn)
                    .OrderByDescending(x => x.CreateTime)
                    .FirstOrDefault();
            });
        }

        /// <summary>
        /// 清空指定业务全部快照
        /// </summary>
        /// <param name="businessSn">业务编号</param>
        public void ClearBusinessHistory(string businessSn)
        {
            ConcurrentSafeHelper.SafeWrite(_rwLock, () =>
            {
                _mementoStore.RemoveAll(x => x.BusinessSn == businessSn);
            });
            Logger.LogInformation("已清空业务[{Sn}]全部历史快照", businessSn);
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : IWorkflowSchedule.cs
*/

using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Workflow
{
    /// <summary>
    /// 流水线调度顶层抽象接口
    /// 新增流程仅需实现接口,完全满足开闭原则,高扩展
    /// </summary>
    public interface IWorkflowSchedule
    {
        /// <summary>
        /// 异步执行全业务流水线
        /// </summary>
        Task RunWholeWorkflowAsync();
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : JewelryWholeWorkflowScheduler.cs
*/
using MementoPattern.Business;
using MementoPattern.Common;
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Workflow
{
    /// <summary>
    /// 珠宝全业务流水线调度器
    /// 严格顺序串联12大业务流程:洽谈→采购→设计→加工→质检→包装→物流→财务→营销→人事→IT→培训
    /// </summary>
    public class JewelryWholeWorkflowScheduler : BaseService<JewelryWholeWorkflowScheduler>, IWorkflowSchedule
    {
        #region 注入全部业务服务
        private readonly BusinessNegotiateService _negotiateService;
        private readonly MaterialPurchaseService _purchaseService;
        private readonly DesignDrawService _designService;
        private readonly ProduceProcessService _produceService;
        private readonly QualityInspectService _inspectService;
        private readonly PackageService _packageService;
        private readonly LogisticsService _logisticsService;
        private readonly FinanceAccountService _financeService;
        private readonly MarketingPromoteService _marketingService;
        private readonly HrAdminService _hrService;
        private readonly ItOperationService _itService;
        private readonly StaffTrainService _trainService;

        public JewelryWholeWorkflowScheduler(ILogger<JewelryWholeWorkflowScheduler> logger,
            BusinessNegotiateService negotiateService,
            MaterialPurchaseService purchaseService,
            DesignDrawService designService,
            ProduceProcessService produceService,
            QualityInspectService inspectService,
            PackageService packageService,
            LogisticsService logisticsService,
            FinanceAccountService financeService,
            MarketingPromoteService marketingService,
            HrAdminService hrService,
            ItOperationService itService,
            StaffTrainService trainService) : base(logger)
        {
            _negotiateService = negotiateService;
            _purchaseService = purchaseService;
            _designService = designService;
            _produceService = produceService;
            _inspectService = inspectService;
            _packageService = packageService;
            _logisticsService = logisticsService;
            _financeService = financeService;
            _marketingService = marketingService;
            _hrService = hrService;
            _itService = itService;
            _trainService = trainService;
        }
        #endregion

        /// <summary>
        /// 异步全流程执行入口
        /// </summary>
        public async Task RunWholeWorkflowAsync()
        {
            string sn = GlobalConfig.BusinessSnPrefix + DateTime.Now.ToString("yyyyMMddHHmmss");
            Logger.LogInformation("==================== 珠宝全业务流水线【开始执行】 编号:{Sn} ====================", sn);
            await Task.Delay(50);

            //1.客户洽谈
            _negotiateService.CustomerTalk("深圳高端私人客户", "18K金一克拉钻戒定制,六爪镶嵌");
            await Task.Delay(50);

            //2.原料采购核验
            bool purchasePass = _purchaseService.PurchaseCheck("黄金", 62.8m);
            if (!purchasePass)
            {
                Logger.LogCritical("原料核验失败,流水线强制终止");
                return;
            }
            await Task.Delay(50);

            //3.设计制图
            _designService.CreateDraft(sn, "黄金", 62.8m, "六爪镶嵌钻戒,戒圈防滑磨砂,主钻1克拉,副钻环绕点缀");
            await Task.Delay(50);

            //4.加工生产
            _produceService.StartProduce(sn, "镶嵌+精细抛光");
            await Task.Delay(50);

            //5.质检
            decimal score = _inspectService.DoInspect(sn);
            await Task.Delay(50);

            //6.包装
            _packageService.PackageGoods(sn, "高端实木珍藏礼盒");
            await Task.Delay(50);

            //7.物流
            _logisticsService.SendDelivery("WL20260805001", "广东省深圳市福田珠宝产业园");
            await Task.Delay(50);

            //8.财务记账
            _financeService.CreateBill(sn, 36800m);
            await Task.Delay(50);

            //9.营销活动
            _marketingService.LaunchActivity("七夕钻戒特惠定制活动");
            await Task.Delay(50);

            //10.人事排班
            _hrService.StaffManage("车间班组人员轮班调整");
            await Task.Delay(50);

            //11.IT运维
            _itService.SystemMaintain("订单数据库索引优化、性能巡检");
            await Task.Delay(50);

            //12.员工培训
            _trainService.ArrangeTrain("新设计师小张", "钻石镶嵌工艺进阶课程");

            Logger.LogInformation("==================== 珠宝全业务流水线【全部执行完毕】 编号:{Sn} ====================", sn);
        }
    }
}

  

/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : BusinessNegotiateService.cs
*/
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务9:客户业务洽谈服务
    /// </summary>
    public class BusinessNegotiateService : BaseService<BusinessNegotiateService>
    {
        public BusinessNegotiateService(ILogger<BusinessNegotiateService> logger) : base(logger)
        {
        }

        public void CustomerTalk(string customerName, string demand)
        {
            Logger.LogInformation("【业务洽谈】客户:{Name},定制需求:{Demand}", customerName, demand);
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : DesignDrawService.cs
*/
using MementoPattern.Core.Base;
using MementoPattern.Pattern.Memento;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务2:珠宝设计制图服务
    /// 职责:图纸创建、状态更新、快照存档
    /// </summary>
    public class DesignDrawService : BaseService<DesignDrawService>
    {
        private readonly BusinessOriginator _originator;
        private readonly MementoCaretaker _caretaker;

        public DesignDrawService(ILogger<DesignDrawService> logger,
            BusinessOriginator originator, MementoCaretaker caretaker) : base(logger)
        {
            _originator = originator;
            _caretaker = caretaker;
        }

        /// <summary>
        /// 创建设计图纸并自动快照存档
        /// </summary>
        /// <param name="businessSn">业务编号</param>
        /// <param name="material">绑定原料</param>
        /// <param name="weight">原料重量</param>
        /// <param name="designText">图纸详情</param>
        public void CreateDraft(string businessSn, string material, decimal weight, string designText)
        {
            Logger.LogInformation("【珠宝设计制图】{Sn}开始绘制图纸", businessSn);
            _originator.CurrentBusinessSn = businessSn;
            _originator.CurrentMaterial = material;
            _originator.CurrentWeight = weight;
            _originator.CurrentDesign = designText;
            //生成快照存档
            var snap = _originator.CreateMemento();
            _caretaker.AddMemento(snap);
            Logger.LogDebug("图纸内容:{Content}", designText);
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : FinanceAccountService.cs
*/

using MementoPattern.Core.Base;
using MementoPattern.Pattern.Memento;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务7:财务记账核算服务
    /// </summary>
    public class FinanceAccountService : BaseService<FinanceAccountService>
    {
        private readonly BusinessOriginator _originator;
        private readonly MementoCaretaker _caretaker;

        public FinanceAccountService(ILogger<FinanceAccountService> logger,
            BusinessOriginator originator, MementoCaretaker caretaker) : base(logger)
        {
            _originator = originator;
            _caretaker = caretaker;
        }

        public void CreateBill(string businessSn, decimal amount)
        {
            Logger.LogInformation("【财务记账】{Sn}入账金额:{Amount:F2}元", businessSn, amount);
            _originator.CurrentBusinessSn = businessSn;
            _originator.CurrentAmount = amount;
            var snap = _originator.CreateMemento();
            _caretaker.AddMemento(snap);
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : HrAdminService.cs
*/
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务10:人事行政管理服务
    /// </summary>
    public class HrAdminService : BaseService<HrAdminService>
    {
        public HrAdminService(ILogger<HrAdminService> logger) : base(logger)
        {
        }

        public void StaffManage(string operate)
        {
            Logger.LogInformation("【人事行政】执行人员管理操作:{Opt}", operate);
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : ItOperationService.cs
*/
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务11:IT系统运维服务
    /// </summary>
    public class ItOperationService : BaseService<ItOperationService>
    {
        public ItOperationService(ILogger<ItOperationService> logger) : base(logger)
        {
        }

        public void SystemMaintain(string workDetail)
        {
            Logger.LogInformation("【IT运维】执行维护任务:{Work}", workDetail);
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : LogisticsService.cs
*/

using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务6:物流配送服务
    /// </summary>
    public class LogisticsService : BaseService<LogisticsService>
    {
        public LogisticsService(ILogger<LogisticsService> logger) : base(logger)
        {
        }

        public void SendDelivery(string deliveryNo, string address)
        {
            Logger.LogInformation("【物流发货】单号{No}下发配送,收货地址:{Addr}", deliveryNo, address);
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : MarketingPromoteService.cs
*/
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务8:营销推广服务
    /// </summary>
    public class MarketingPromoteService : BaseService<MarketingPromoteService>
    {
        public MarketingPromoteService(ILogger<MarketingPromoteService> logger) : base(logger)
        {
        }

        public void LaunchActivity(string activityName)
        {
            Logger.LogInformation("【营销推广】活动[{Act}]全渠道上线", activityName);
            Logger.LogDebug("门店、电商、短视频渠道同步投放预热");
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : MaterialPurchaseService.cs
*/
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务1:原料采购核验服务
    /// 职责:原料合法性校验、入库判定、日志记录
    /// </summary>
    public class MaterialPurchaseService : BaseService<MaterialPurchaseService>
    {
        public MaterialPurchaseService(ILogger<MaterialPurchaseService> logger) : base(logger)
        {
        }

        /// <summary>
        /// 原料采购入库核验
        /// </summary>
        /// <param name="materialName">原料名称:黄金/铂金/钻石/玉石</param>
        /// <param name="weight">原料重量g</param>
        /// <returns>true核验通过入库,false驳回</returns>
        public bool PurchaseCheck(string materialName, decimal weight)
        {
            Logger.LogInformation("【原料采购核验】原料:{Name},重量:{Weight}g", materialName, weight);
            bool legalMaterial = materialName is "黄金" or "铂金" or "钻石" or "玉石";
            bool legalWeight = weight > 0;
            bool pass = legalMaterial && legalWeight;

            if (pass)
            {
                Logger.LogInformation("原料核验通过,准许入库登记");
            }
            else
            {
                Logger.LogError("原料非法/重量异常,驳回入库申请");
            }
            return pass;
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : PackageService.cs
*/
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务5:成品包装服务
    /// 职责:礼盒封装、防伪绑定
    /// </summary>
    public class PackageService : BaseService<PackageService>
    {
        public PackageService(ILogger<PackageService> logger) : base(logger)
        {
        }

        public void PackageGoods(string businessSn, string boxType)
        {
            Logger.LogInformation("【成品包装】{Sn}使用{Box}礼盒封装", businessSn, boxType);
            Logger.LogDebug("防伪标签、珠宝鉴定证书绑定完成");
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : ProduceProcessService.cs
*/
using MementoPattern.Core.Base;
using MementoPattern.Pattern.Memento;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务3:加工生产服务
    /// 职责:下发加工任务、进度监控、工艺记录
    /// </summary>
    public class ProduceProcessService : BaseService<ProduceProcessService>
    {
        private readonly BusinessOriginator _originator;
        private readonly MementoCaretaker _caretaker;

        public ProduceProcessService(ILogger<ProduceProcessService> logger,
            BusinessOriginator originator, MementoCaretaker caretaker) : base(logger)
        {
            _originator = originator;
            _caretaker = caretaker;
        }

        /// <summary>
        /// 启动加工任务
        /// </summary>
        /// <param name="businessSn">业务编号</param>
        /// <param name="craft">工艺:镶嵌/雕花/抛光/拉丝</param>
        public void StartProduce(string businessSn, string craft)
        {
            Logger.LogInformation("【加工生产】{Sn}启动{Craft}工艺加工", businessSn, craft);
            _originator.CurrentBusinessSn = businessSn;
            _originator.CurrentCraft = craft;
            int progress = Random.Shared.Next(20, 101);
            Logger.LogDebug("实时加工进度:{Progress}%", progress);
            var snap = _originator.CreateMemento();
            _caretaker.AddMemento(snap);
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : QualityInspectService.cs
*/
using MementoPattern.Core.Base;
using MementoPattern.Pattern.Memento;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务4:成品质检服务
    /// 职责:质量打分、等级判定、快照存档
    /// </summary>
    public class QualityInspectService : BaseService<QualityInspectService>
    {
        private readonly BusinessOriginator _originator;
        private readonly MementoCaretaker _caretaker;

        public QualityInspectService(ILogger<QualityInspectService> logger,
            BusinessOriginator originator, MementoCaretaker caretaker) : base(logger)
        {
            _originator = originator;
            _caretaker = caretaker;
        }

        /// <summary>
        /// 执行质检
        /// </summary>
        /// <param name="businessSn">业务编号</param>
        /// <returns>质检分数</returns>
        public decimal DoInspect(string businessSn)
        {
            Logger.LogInformation("【成品质量检测】开始检测{Sn}", businessSn);
            decimal score = Random.Shared.Next(600, 1000) / 10m;
            _originator.CurrentBusinessSn = businessSn;
            _originator.CurrentScore = score;
            var snap = _originator.CreateMemento();
            _caretaker.AddMemento(snap);

            if (score >= 90) Logger.LogInformation("质检合格,评级优等");
            else if (score >= 70) Logger.LogWarning("质检待复检,评级中等");
            else Logger.LogError("质检不合格,判定报废");
            return score;
        }
    }
}


/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : StaffTrainService.cs
*/
using MementoPattern.Core.Base;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Text;

namespace MementoPattern.Business
{
    /// <summary>
    /// 业务12:员工工艺培训服务
    /// </summary>
    public class StaffTrainService : BaseService<StaffTrainService>
    {
        public StaffTrainService(ILogger<StaffTrainService> logger) : base(logger)
        {
        }

        public void ArrangeTrain(string traineeName, string course)
        {
            Logger.LogInformation("【员工培训】为{Name}安排{Course}课程", traineeName, course);
        }
    }
}

  

调用:

/* 
# encoding: utf-8 
# 版权所有  2026 ©涂聚文有限公司™ ®
# 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎
# 描述:设计模式 Design Patterns 行为模式 Behavioral Patterns  备忘录模式 Memento Pattern  
# Author    : geovindu,Geovin Du 涂聚文.
# IDE       : vs2026 c# .net 10
# os        : windows 10
# database  : mysql 9.0 sql server 2019, postgreSQL 17.0  Oracle 21c Neo4j
# Datetime  : 2026/07/25 20:05  
# User      :  geovindu
# Product   : Visual Studio 2026
# Project   : CSharpDesignPatterns
# File      : MementoBll.cs
*/


using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using MementoPattern.Core.Logging;
using MementoPattern.Pattern.Memento;
using MementoPattern.Business;
using MementoPattern.Workflow;




namespace BLL
{


    /// <summary>
    /// 
    /// </summary>
    public class MementoBll
    {
        public async void Demo()
        {
            //1、构建通用主机
            IHost host = Host.CreateDefaultBuilder(Array.Empty<string>())
                .ConfigureLogging((context, loggingBuilder) =>
                {
                    //全局统一日志初始化
                    LoggerBuildFactory.BuildGlobalLogger(loggingBuilder);
                })
                .ConfigureServices((context, services) =>
                {
                    #region DI 依赖注入注册(Scoped生命周期)
                    //备忘录核心类注册
                    services.AddScoped<BusinessOriginator>();
                    services.AddScoped<MementoCaretaker>();

                    //12个业务服务注册
                    services.AddScoped<BusinessNegotiateService>();
                    services.AddScoped<MaterialPurchaseService>();
                    services.AddScoped<DesignDrawService>();
                    services.AddScoped<ProduceProcessService>();
                    services.AddScoped<QualityInspectService>();
                    services.AddScoped<PackageService>();
                    services.AddScoped<LogisticsService>();
                    services.AddScoped<FinanceAccountService>();
                    services.AddScoped<MarketingPromoteService>();
                    services.AddScoped<HrAdminService>();
                    services.AddScoped<ItOperationService>();
                    services.AddScoped<StaffTrainService>();

                    //流程调度接口绑定实现
                    services.AddScoped<IWorkflowSchedule, JewelryWholeWorkflowScheduler>();
                    #endregion
                })
                .Build();

            //2、创建作用域,执行业务流水线
            using (IServiceScope scope = host.Services.CreateScope())
            {
                IServiceProvider provider = scope.ServiceProvider;
                IWorkflowSchedule scheduler = provider.GetRequiredService<IWorkflowSchedule>();
                await scheduler.RunWholeWorkflowAsync();
            }

            //3、正常关闭主机,释放全部托管资源
            await host.StopAsync();
        }
    }
}

  

输出:

0fe27bee-5f7a-4087-94f9-4af245833d1d

 

posted @ 2026-08-05 21:39  ®Geovin Du Dream Park™  阅读(2)  评论(0)    收藏  举报