CSharp: Factory Method Pattern using .Net 10
项目结构展示了一个基于工厂方法模式的珠宝企业业务系统实现。系统采用C#语言开发包含以下核心组件工厂模式抽象层定义了JewelryBusinessFactory基类和IJewelryBusinessProcess接口业务实现层12个具体业务流程类如原料采购、设计制图、生产加工等并发调度器ProcessConcurrentScheduler支持同步/异步并行执行日志系统使用Microsoft.Extensions.Logging实现多级别日志记录线程安全通过ReaderWriterLockSlim确保并发安全系统特点采用工厂方法模式解耦业务创建与执行支持高并发处理默认最大并发数12完善的日志跟踪包含TraceId链路追踪异常处理机制同步/异步两种执行模式调用示例展示了如何注册所有业务工厂并执行同步/异步并发处理输出各业务环节的执行日志。/* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : LogScopeHelper.cs */ using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.Infrastructure.Logging { /// summary /// /// /summary public static class LogScopeHelper { /// summary /// 绑定链路TraceId、业务模块到日志Scope /// /summary public static IDisposable CreateBusinessScope(this ILogger logger, string traceId, string moduleName) { return logger.BeginScope(new Dictionarystring, object { [TraceId] traceId, [Module] moduleName }); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : FileLogSetup.cs */ using Karambolo.Extensions.Logging.File; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.Infrastructure.Logging { public static class FileLogSetup { // 全局静态日志工厂和你原有写法保持一致 private static readonly ILoggerFactory _loggerFactory; /// summary /// /// /summary static FileLogSetup() { string logRoot Path.Combine(AppContext.BaseDirectory, logs); // 自动创建日志目录防止权限/目录不存在报错 Directory.CreateDirectory(logRoot); _loggerFactory LoggerFactory.Create(builder { // 清空默认提供程序 builder.ClearProviders(); // 设置全局最低日志级别 builder.SetMinimumLevel(LogLevel.Trace); // 启用Karambolo File日志多文件配置Info/Error分离 builder.AddFile(fileBuilder { fileBuilder.RootPath AppContext.BaseDirectory; string todayDate DateTime.Now.ToString(yyyy-MM-dd); fileBuilder.Files new[] { // 1. Info日志仅记录 Information 及以上 new LogFileOptions { Path $logs/info-{todayDate}.log, MaxFileSize 1000000, // 单文件最大1MB MinLevel new Dictionarystring, LogLevel { [] LogLevel.Information }, IncludeScopes true, // 开启Scope自定义字段 }, // 2. Error日志仅记录 Error / Critical new LogFileOptions { Path $logs/error-{todayDate}.log, MaxFileSize 1000000, MinLevel new Dictionarystring, LogLevel { [] LogLevel.Error }, IncludeScopes true, } }; }); }); } /// summary /// 获取泛型日志实例和原有调用方式完全一致 /// /summary /// typeparam nameT日志归属类型/typeparam /// returnsILogger/returns public static ILoggerT CreateLoggerT() { return _loggerFactory.CreateLoggerT(); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : ProcessConcurrentScheduler.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Exceptions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.Infrastructure.Concurrency { /// summary /// /// /summary public sealed class ProcessConcurrentScheduler { private readonly ConcurrentBagJewelryBusinessFactory _factoryPool new(); private readonly int _maxDegreeOfParallelism; private readonly ILoggerProcessConcurrentScheduler _logger FileLogSetup.CreateLoggerProcessConcurrentScheduler(); public ProcessConcurrentScheduler(int maxParallel 12) { _maxDegreeOfParallelism maxParallel; } public void RegisterFactory(JewelryBusinessFactory factory) { ConcurrentLockHelper.WriteLock(() _factoryPool.Add(factory)); _logger.LogInformation(注册业务工厂{FactoryName}, factory.GetType().Name); } public void RunAllSync(ProcessContext globalCtx) { using var scope _logger.CreateBusinessScope(globalCtx.TraceId.ToString(), 调度器同步执行); _logger.LogInformation(开始同步批量执行全部业务流程最大并发数{MaxParallel}, _maxDegreeOfParallelism); Parallel.ForEach(_factoryPool, new ParallelOptions { MaxDegreeOfParallelism _maxDegreeOfParallelism }, factory { try { var process factory.CreateProcess(); process.Execute(globalCtx); } catch (BusinessProcessException ex) { _logger.LogError(ex, 业务流程异常{ProcessName}, ex.ProcessName); } catch (Exception ex) { _logger.LogError(ex, 全局未知同步异常); } }); _logger.LogInformation(同步批量业务流程执行完毕); } public async Task RunAllAsync(ProcessContext globalCtx, CancellationToken token default) { using var scope _logger.CreateBusinessScope(globalCtx.TraceId.ToString(), 调度器异步执行); _logger.LogInformation(开始异步批量执行全部业务流程); var tasks new ListTask(); foreach (var factory in _factoryPool) { tasks.Add(Task.Run(async () { try { var process factory.CreateProcess(); await process.ExecuteAsync(globalCtx, token); } catch (BusinessProcessException ex) { _logger.LogError(ex, 异步业务流程异常{ProcessName}, ex.ProcessName); } catch (Exception ex) { _logger.LogError(ex, 全局未知异步异常); } }, token)); } await Task.WhenAll(tasks); _logger.LogInformation(异步批量业务流程执行完毕); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : ConcurrentLockHelper.cs */ using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.Core.ThreadSafe { /// summary /// /// /summary public static class ConcurrentLockHelper { private static readonly ReaderWriterLockSlim GlobalRwLock new(LockRecursionPolicy.SupportsRecursion); public static void ReadLock(Action action) { GlobalRwLock.EnterReadLock(); try { action.Invoke(); } finally { GlobalRwLock.ExitReadLock(); } } public static void WriteLock(Action action) { GlobalRwLock.EnterWriteLock(); try { action.Invoke(); } finally { GlobalRwLock.ExitWriteLock(); } } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : ProcessContext.cs */ using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.Core.Models { /// summary /// /// /summary public sealed class ProcessContext { public Guid TraceId { get; init; } public DateTime StartTime { get; init; } DateTime.Now; public Dictionarystring, object DataBag { get; } new(); public bool IsTransactionRequired { get; set; } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : BusinessProcessException.cs */ using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.Core.Exceptions { /// summary /// /// /summary public sealed class BusinessProcessException : Exception { public string ProcessName { get; } public BusinessProcessException(string processName, string message) : base(message) { ProcessName processName; } public BusinessProcessException(string processName, string message, Exception innerEx) : base(message, innerEx) { ProcessName processName; } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : JewelryBusinessFactory.cs */ using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.Core.Abstractions { /// summary /// /// /summary public abstract class JewelryBusinessFactory { private readonly object _singletonLock new(); private IJewelryBusinessProcess? _cachedProcess; public IJewelryBusinessProcess CreateProcess() { if (_cachedProcess ! null) return _cachedProcess; lock (_singletonLock) { _cachedProcess ?? CreateConcreteProcess(); } return _cachedProcess; } protected abstract IJewelryBusinessProcess CreateConcreteProcess(); } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : IJewelryBusinessProcess.cs */ using FactoryMethodPattern.Core.Models; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.Core.Abstractions { /// summary /// /// /summary public interface IJewelryBusinessProcess { string ProcessName { get; } void Execute(ProcessContext context); Task ExecuteAsync(ProcessContext context, CancellationToken token default); } }/* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : BusinessProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class BusinessProcess : IJewelryBusinessProcess { public string ProcessName 业务; private readonly ILoggerBusinessProcess _logger FileLogSetup.CreateLoggerBusinessProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【{ProcessName}】客户对接、订单洽谈、合同签订、售后跟进); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】客户对接、订单洽谈、合同签订、售后跟进); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : DesignDrawingProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { public sealed class DesignDrawingProcess : IJewelryBusinessProcess { public string ProcessName 设计制图; private readonly ILoggerDesignDrawingProcess _logger FileLogSetup.CreateLoggerDesignDrawingProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【{ProcessName}】3D建模、款式设计、图纸审核、客户确认); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】3D建模、款式设计、图纸审核、客户确认); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : FinanceProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class FinanceProcess : IJewelryBusinessProcess { public string ProcessName 财务; private readonly ILoggerFinanceProcess _logger FileLogSetup.CreateLoggerFinanceProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【{ProcessName}】成本核算、应收应付、开票、工资结算、报表生成); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】成本核算、应收应付、开票、工资结算、报表生成); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : HRAdminProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class HRAdminProcess : IJewelryBusinessProcess { public string ProcessName 人事行政; private readonly ILoggerHRAdminProcess _logger FileLogSetup.CreateLoggerHRAdminProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【{ProcessName}】招聘、考勤、社保、办公用品管理、制度执行); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】招聘、考勤、社保、办公用品管理、制度执行); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : ITProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class ITProcess : IJewelryBusinessProcess { public string ProcessName IT; private readonly ILoggerITProcess _logger FileLogSetup.CreateLoggerITProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【 {ProcessName}】系统维护、数据备份、网络安全、软件更新、设备检修); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】系统维护、数据备份、网络安全、软件更新、设备检修); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : LogisticsProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class LogisticsProcess : IJewelryBusinessProcess { public string ProcessName 物流; private readonly ILoggerLogisticsProcess _logger FileLogSetup.CreateLoggerLogisticsProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【 {ProcessName}】订单打包、保价发货、轨迹跟踪、签收确认); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】订单打包、保价发货、轨迹跟踪、签收确认); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : MarketingProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class MarketingProcess : IJewelryBusinessProcess { public string ProcessName 营销推广; private readonly ILoggerMarketingProcess _logger FileLogSetup.CreateLoggerMarketingProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【{ProcessName}】线上直播、短视频运营、门店活动、品牌宣传); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】线上直播、短视频运营、门店活动、品牌宣传); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : PackagingProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class PackagingProcess : IJewelryBusinessProcess { public string ProcessName 包装; private readonly ILoggerPackagingProcess _logger FileLogSetup.CreateLoggerPackagingProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【{ProcessName}】礼盒包装、证书装订、防伪标签粘贴); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】礼盒包装、证书装订、防伪标签粘贴); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : ProductionProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class ProductionProcess : IJewelryBusinessProcess { public string ProcessName 加工生产; private readonly ILoggerProductionProcess _logger FileLogSetup.CreateLoggerProductionProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【⚒️{ProcessName}】失蜡铸造、宝石镶嵌、抛光、打磨); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】失蜡铸造、宝石镶嵌、抛光、打磨); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : QualityInspectionProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class QualityInspectionProcess : IJewelryBusinessProcess { public string ProcessName 质检; private readonly ILoggerQualityInspectionProcess _logger FileLogSetup.CreateLoggerQualityInspectionProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【⚒️{ProcessName}】工艺检查、纯度复检、尺寸校验、合格判定); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】工艺检查、纯度复检、尺寸校验、合格判定); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : RawMaterialPurchaseProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Core.Exceptions; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class RawMaterialPurchaseProcess : IJewelryBusinessProcess { public string ProcessName 原料采购核验; private readonly ILoggerRawMaterialPurchaseProcess _logger FileLogSetup.CreateLoggerRawMaterialPurchaseProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【{ProcessName}】金/银/宝石验收、纯度检测、入库登记); _logger.LogInformation(金/银/宝石验收、纯度检测、入库登记); if (context.DataBag.TryGetValue(MaterialWeight, out var weightObj) decimal.TryParse(weightObj.ToString(), out decimal weight) weight 0) { throw new BusinessProcessException(ProcessName, 原料重量不能小于等于0); } }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } } /* # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述 Factory Method 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : TrainingProcess.cs */ using FactoryMethodPattern.Core.Abstractions; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Core.ThreadSafe; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Text; namespace FactoryMethodPattern.BusinessModule.Processes { /// summary /// /// /summary public sealed class TrainingProcess : IJewelryBusinessProcess { public string ProcessName 培训; private readonly ILoggerTrainingProcess _logger FileLogSetup.CreateLoggerTrainingProcess(); public void Execute(ProcessContext context) { ConcurrentLockHelper.ReadLock(() { Console.WriteLine($[{context.TraceId}]【{ProcessName}】新品知识、销售技巧、工艺标准、企业文化培训); _logger.LogInformation($[{context.TraceId}]【{ProcessName}】新品知识、销售技巧、工艺标准、企业文化培训); }); } public async Task ExecuteAsync(ProcessContext context, CancellationToken token default) { await Task.Run(() Execute(context), token); } } }调用/* * # encoding: utf-8 # 版权所有 2026 ©涂聚文有限公司™ ® # 许可信息查看言語成了邀功盡責的功臣還需要行爲每日來值班嗎 # 描述工厂方法模式 FactoryMethod 演示业务层 # 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/04 22:16 # User : geovindu # Product : Visual Studio 2026 # Project : CSharpDesignPattern # File : FactoryMethodBll.cs * * **/ using System; using System.Collections.Generic; using System.Text; using FactoryMethodPattern; using FactoryMethodPattern.BusinessModule.Factories; using FactoryMethodPattern.Core.Models; using FactoryMethodPattern.Infrastructure.Concurrency; using FactoryMethodPattern.Infrastructure.Logging; using Microsoft.Extensions.Logging; namespace BLL { public class FactoryMethodBll { /// summary /// /// /summary public async void Demo() { // 程序根日志 var rootLogger FileLogSetup.CreateLoggerFactoryMethodBll(); // 全局业务链路上下文 var globalContext new ProcessContext { TraceId Guid.NewGuid(), IsTransactionRequired true }; globalContext.DataBag.Add(MaterialWeight, 1200.00m); using var rootScope rootLogger.CreateBusinessScope(globalContext.TraceId.ToString(), 程序入口); rootLogger.LogInformation((工厂方法模式珠宝企业工厂业务系统启动链路TraceId{TraceId}, globalContext.TraceId); // 初始化调度器 var scheduler new ProcessConcurrentScheduler(12); // 注册全部业务工厂 scheduler.RegisterFactory(new RawMaterialPurchaseFactory()); scheduler.RegisterFactory(new DesignDrawingFactory()); scheduler.RegisterFactory(new ProductionFactory()); scheduler.RegisterFactory(new QualityInspectionFactory()); scheduler.RegisterFactory(new PackagingFactory()); scheduler.RegisterFactory(new LogisticsFactory()); scheduler.RegisterFactory(new FinanceFactory()); scheduler.RegisterFactory(new MarketingFactory()); scheduler.RegisterFactory(new BusinessFactory()); scheduler.RegisterFactory(new HRAdminFactory()); scheduler.RegisterFactory(new ITFactory()); scheduler.RegisterFactory(new TrainingFactory()); // 同步并发执行 Console.WriteLine(\n 同步高并发执行 ); scheduler.RunAllSync(globalContext); // 异步并发执行 Console.WriteLine(\n 异步高并发执行 ); await scheduler.RunAllAsync(globalContext); rootLogger.LogInformation(全部业务流程执行完成程序即将退出); Console.WriteLine(执行完成按任意键退出); Console.ReadLine(); } } }输出

相关新闻

嵌入式(C语言基础)

嵌入式(C语言基础)

1.内存分为四个区域:栈区,堆区,数据区,代码区栈区:由编译器自动分配,存放局部变量堆区:程序员手动分配,手动存放数据区:存放全局变量,静态变量代码区:只读,存放程序指令2.作用域和生命周期作用域…

2026/7/7 1:22:48阅读更多 →
信号完整性误区解析:25MHz 时钟信号实测,揭示上升沿比频率更关键

信号完整性误区解析:25MHz 时钟信号实测,揭示上升沿比频率更关键

25MHz时钟信号设计陷阱:为什么上升沿比频率更能摧毁你的电路?当我在深圳一家通信设备公司担任硬件工程师时,曾遇到一个令人费解的问题——一块使用25MHz时钟的工控板频繁出现数据错误,而同样频率的另一块板却运行完美。经过三天三…

2026/7/7 1:22:48阅读更多 →
搞定企业级SSO单点登录:OAuth2、OIDC与SAML真实排障血泪史

搞定企业级SSO单点登录:OAuth2、OIDC与SAML真实排障血泪史

搞定企业级SSO单点登录:OAuth2、OIDC与SAML真实排障血泪史 OAuth 2.0:你以为是登录,其实就是借张房卡 OAuth 2.0的本质就是“授权”。这就好比你去住酒店,你去前台拿了一张房卡,这张房卡能刷开你的房间门,也…

2026/7/7 1:22:48阅读更多 →
为什么别家视频孪生总丢目标?CameraGraph拓扑图谱从底层解决跨镜追踪漂移痛点

为什么别家视频孪生总丢目标?CameraGraph拓扑图谱从底层解决跨镜追踪漂移痛点

为什么别家视频孪生总丢目标?CameraGraph拓扑图谱从底层解决跨镜追踪漂移痛点一、行业共性:市面视频孪生频繁丢目标、ID漂移的三大底层根源市面上绝大多数视频孪生跨镜追踪全程依托ReID外观特征匹配做身份关联,技术范式停留在「二维图像比对」…

2026/7/7 2:27:53阅读更多 →
【单片机毕业设计】基于 STM32 的智能循迹避障小车控制系统设计,基于单片机的多功能智能小车感知检测系统开发(017401)

【单片机毕业设计】基于 STM32 的智能循迹避障小车控制系统设计,基于单片机的多功能智能小车感知检测系统开发(017401)

文章目录 20 个相关毕业设计备选题目项目研究背景摘要总体方案一、核心硬件清单及选型说明二、整体硬件搭建方案 核心功能一、核心自主行驶功能二、模式切换与预警功能三、辅助监测可视化功能 技术路线项目演示关于我们项目案例源码获取 博主介绍:✌️码农一枚 &…

2026/7/7 2:27:53阅读更多 →
全栈大模型智能体系统架构:从模型调用到自主协作的工程实践

全栈大模型智能体系统架构:从模型调用到自主协作的工程实践

一、引言:架构范式的根本转移 当大模型(LLM)的能力逐渐同质化,基于Agent(智能体)的应用架构正在成为新的技术护城河。2026年AI技术生态迎来了一个关键转折:单一模型能力已无法满足复杂业务需求&…

2026/7/7 2:27:53阅读更多 →
FlaUInspect:革新UI自动化测试的现代化元素检查器

FlaUInspect:革新UI自动化测试的现代化元素检查器

1. 项目概述:为什么我们需要FlaUInspect? 如果你做过UI自动化测试,尤其是基于微软UI自动化(UIA)框架的,那你一定对“找元素”这个环节又爱又恨。爱的是,一旦元素定位稳定,自动化脚本…

2026/7/7 2:27:53阅读更多 →
2.4 数据治理 vs 数据管理 vs 数据运维:三者的边界、协同与“定战略、抓执行、保稳定”的逻辑

2.4 数据治理 vs 数据管理 vs 数据运维:三者的边界、协同与“定战略、抓执行、保稳定”的逻辑

2.4 数据治理 vs 数据管理 vs 数据运维:三者的边界、协同与“定战略、抓执行、保稳定”的逻辑2.4.1 概念辨析:治理、管理、运维的本质区别2.4.2 数据治理:定战略——数据的“立法与司法”机构核心定义核心活动责任主体:业务 管理…

2026/7/7 2:27:53阅读更多 →
翡翠定制怕货不对版?从选料、设计到复检的完整避坑指南

翡翠定制怕货不对版?从选料、设计到复检的完整避坑指南

靠谱的翡翠定制,核心不在于商家喊“包你满意”,而在于他敢不敢把选料、设计、加工到复检的每一步,都变成可核对、可留痕的流程。以四会源头工厂“臻世祥”为观察样本,我们来看一套可验证的定制避坑标准,以及如何用这套…

2026/7/7 2:22:53阅读更多 →
从GitHub安全案例解析常见漏洞与防护实践

从GitHub安全案例解析常见漏洞与防护实践

1. 项目概述:从GitHub Trending看安全实战 最近在GitHub Trending上看到一个项目,叫 skills4/skills ,它因为一些安全漏洞案例被大家讨论。这其实是一个挺典型的场景:一个旨在展示或教授某种技能的仓库,本身却成了安…

2026/7/6 4:26:20阅读更多 →
MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

MLT 2026启示:因果推理与概率建模驱动下一代LLM应用

# MLT 2026启示:因果推理与概率建模驱动下一代LLM应用## 一、背景与挑战:从“黑箱预测”到“可信推理”2026年6月,第7届机器学习与趋势国际会议(MLT 2026)将在悉尼召开。会议议程中,“因果与可解释机器学习…

2026/7/6 2:48:33阅读更多 →
通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

通达OA SQL注入漏洞深度剖析:从手工注入到自动化利用与防御

1. 项目概述与漏洞背景最近在梳理一些历史OA系统的安全风险时,通达OA v11.6版本中的一个老漏洞又进入了我的视线。这个漏洞位于/general/bi_design/appcenter/report_bi.func.php文件中,是一个典型的SQL注入点。虽然这个漏洞的利用方式看起来并不复杂&am…

2026/7/7 1:03:28阅读更多 →
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践

1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8…

2026/7/7 0:02:41阅读更多 →
国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot)

国产化信创改造:达梦/人大金仓适配与多数据库兼容方案实战(SpringBoot) 🌐 演示地址:http://ruoyioffice.com | 📦 源码1GitHub:ruoyi-office | 📦 源码2GitCode:ruoyi-o…

2026/7/7 0:02:41阅读更多 →
CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS 7/8 SSH 连接失败:5步系统性排错流程与决策树

CentOS SSH连接故障排查:从基础检查到深度修复的完整指南引言当你尝试通过Xshell或其他SSH客户端连接CentOS服务器时,突然遭遇"Connection refused"或"Connection timed out"的错误提示,这种经历对任何运维人员或开发者来…

2026/7/7 0:02:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/6 4:45:01阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/6 4:45:01阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/6 4:45:03阅读更多 →