自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

一个热爱编程的人

分项些工作中用到的技术,希望帮助到你

  • 博客(103)
  • 资源 (2)
  • 收藏
  • 关注

原创 命令模式实战:把“下单后的动作“打包成可执行的任务

将订单后置动作封装为命令对象,通过命令模式实现解耦。每个动作(如发短信、发积分)独立成命令,支持异步执行、失败重试、排队削峰、日志记录与批量重放。主流程仅负责创建并提交命令,提升可维护性与扩展性,满足高可靠业务需求。

2026-09-25 23:34:49 229

原创 责任链模式实战:审批流里“层层把关“的艺术

本文介绍责任链模式在报销审批系统中的应用:通过将审批人构建成一条可动态配置的处理链,实现请求的自动传递与分层处理。相比嵌套if/else,该模式解耦了发送者与接收者,支持灵活扩展审批层级与规则变更,提升代码可维护性与可读性。

2026-09-25 23:34:06 161

原创 代理模式实战:给订单查询加一道“缓存与审计“的关卡

代理模式通过在真实对象外层封装代理,实现缓存与审计等横切关注点的无感叠加。订单查询场景中,代理链先记录操作日志,再查缓存命中,未命中则调用真实仓储并回填缓存,既提升性能又满足合规要求。核心优势在于:功能扩展与业务逻辑分离,调用方无需感知,维护性与可扩展性显著增强。

2026-09-24 17:37:49 205

原创 享元模式实战:让“城市字典“只存一份

一句话定位:运用共享技术有效地支持大量细粒度对象——把"内在状态(可共享)"和"外在状态(随场景变化)"分离,减少对象数量、节省内存。

2026-09-24 17:37:11 248

原创 外观模式实战:给“下单履约“一个干净的入口

外观模式为复杂子系统提供统一入口,将“提交订单”这一业务流程封装为OrderFacade.SubmitOrderAsync,隐藏库存、订单、支付等底层细节。调用方无需关心实现顺序与依赖,只需调用门面接口,即可完成全流程操作,实现高内聚、低耦合,提升可维护性与易用性。

2026-09-24 17:36:37 112

原创 组合模式实战:把“部门-人员“权限树当一棵树来算

组合模式将部门与人员统一抽象为IOrgNode,实现“部分-整体”层次结构的透明处理。通过叶子节点(人员)和组合节点(部门)的统一接口,客户端可一致调用GetPermissions(),无需区分操作对象是单个成员还是整棵组织树,自动递归汇总权限,解决权限系统中批量授权与个体授权逻辑分离的问题,提升代码复用性与可维护性。

2026-09-23 15:33:50 107

原创 装饰器模式实战:用“叠Buff“的方式给数据流加能力

一句话定位:动态地给一个对象添加额外的职责,比继承更灵活——像给核心功能"叠 buff",一层套一层,互不干扰。

2026-09-23 15:33:17 112

原创 桥接模式实战:消息推送的“渠道 × 类型“二维矩阵

桥接模式将消息类型与发送渠道分离,解决多维度变化导致的类爆炸问题。通过抽象(消息类型)与实现(渠道)的组合,实现两者独立演化:新增类型或渠道只需扩展对应体系,复杂度从乘法降为加法。代码中以接口IMessageChannel和基类AppMessage构建桥梁,各渠道(短信、邮件、站内信等)与各类消息(验证码、营销、告警等)通过组合灵活搭配,提升系统可维护性与扩展性。

2026-09-22 20:41:01 314

原创 适配器模式实战:把“各家短信 SDK“驯服成统一接口

适配器模式将不兼容的短信接口统一为ISmsSender标准接口,通过适配器封装阿里云、腾讯云及第三方短信SDK,使业务层无需关心具体实现。各适配器内部转换参数并处理异常,实现解耦与可替换性,提升系统灵活性与可测试性。

2026-09-22 20:40:23 231

原创 原型模式实战:消息模板的“复制-改一改“套路

通过原型模式实现消息模板的深拷贝,避免因复用同一对象导致占位符污染。在营销系统中,为每个订单安全复制模板副本并填充个性化数据,确保高并发下消息生成的正确性与高效性。

2026-09-21 17:35:01 162

原创 建造者模式实战:告别“十参数构造函数“的数据导出任务

建造者模式将复杂对象的构建与表示分离,通过链式调用实现灵活、可读的参数组装。以数据导出任务为例,避免构造函数参数过多带来的混乱,支持可选配置的按需设置,并在Build()时校验合法性,提升代码可维护性与安全性。

2026-09-21 17:34:24 156

原创 单例模式实战:配置中心里“唯一一份“的坚持

本文详解单例模式在.NET中的实战应用,聚焦配置管理场景:通过Lazy<T>实现线程安全的懒加载单例,确保全局唯一实例,避免重复加载、状态不一致与共享可变状态问题。代码以AppConfig为例,展示如何安全加载并统一访问配置,强调其与DI容器单例的区别——自建单例适用于全局依赖,无需依赖注入,使用更灵活。建议仅对配置等天然唯一的对象使用,避免滥用。

2026-09-21 17:33:49 129

原创 抽象工厂模式实战:报表导出系统的“成套零件“问题

抽象工厂模式解决报表导出中“格式与风格必须配套”的问题。通过定义统一工厂接口,将Excel与PDF两类互相关联的产品(导出器+样式器)封装成独立产品族,确保调用方获取的组件天然配套,杜绝混搭错误。结合依赖注入,可灵活按配置选择工厂,实现高内聚、低耦合的扩展架构。

2026-09-20 11:21:32 211

原创 工厂方法模式实战:让支付渠道接入告别“改一处、崩一片“

一句话定位:定义一个创建对象的接口,让子类决定实例化哪一个类,把"对象的创建"从"对象的使用"中解耦出来。

2026-09-20 11:20:54 709

原创 用 Quartz.NET 优雅地处理 .NET 定时任务:从选型到 Docker 部署全记录

本文探讨.NET后端定时任务的实现方案,对比了BackgroundService + Timer与Quartz.NET的适用场景。前者适合简单周期任务,后者凭借强大的Cron调度能力与解耦设计,更适用于复杂业务。实践中,结合Docker容器化部署,实现任务的标准化、可维护与易扩展,并通过挂载日志目录解决容器日志丢失问题,最终形成一套高效稳定的定时任务体系。

2026-09-19 22:59:42 533

原创 用 YARP 为 .NET 微服务搭一座“立交桥“:路由转发与生产配置实践

API 网关是微服务架构的关键入口,解决客户端访问多个后端服务的混乱问题。通过统一入口,实现路由、负载均衡、鉴权、限流等横切功能集中管理。使用 .NET 生态的 YARP 可轻量搭建反向代理网关,基于配置灵活定义路由与集群,支持权重负载均衡实现灰度发布。结合 HTTPS 强制跳转、日志追踪、真实客户端 IP 透传等能力,保障生产环境安全与可观测性,让多服务系统更稳定、易维护。

2026-09-19 22:58:51 248

原创 MailKit 实战:断网邮件队列、中文附件单据与收发两端的工程化

先划边界:邮件在 PMS_V2 里有两个方向——发件(RFQ/PO/报表外发,走 SMTP SUBMISSION)和收件(供应商回函与附件,走 IMAP 为主、POP3 兜底)。船端全程离线,只在卫星窗口联网;岸基机房正常联网,但我们要求船端和岸基共用同一套邮件组件与大部分代码。维度(BCL 内置)托管事务邮件 API(SendGrid / Mailgun / Amazon SES 等)官方态度Microsoft Learn 明确"不建议新开发使用,不支持许多现代协议"微软文档直接点名推荐的替代库。

2026-09-18 12:27:06 162

原创 Dapper 实战:复杂报表读模型与 EF Core 读写协同

本文通过三个真实事故揭示报表查询过度依赖EF的隐患:N+1查询、SQL注入与列映射静默错误。提出“写侧用EF,复杂读用Dapper”的分工策略——EF负责领域一致性与变更跟踪,Dapper掌控复杂查询的性能与SQL控制力。强调Dapper作为IDbConnection的轻量扩展,通过参数化查询、高效映射与多结果集支持,实现安全、高效、可维护的报表开发,同时支持与EF共享连接与事务,是PMS系统中读写分离的最优实践。

2026-09-18 12:26:20 207

原创 QuestPDF 实战——询价单、采购订单、货架标签的离船 PDF 生成

本文复盘四个真实事故:字体缺失致中文乱码、许可证未配置导致服务崩溃、表格分页错误及原生库依赖失败,揭示QuestPDF在生产落地中的四大核心挑战。基于2026.9.0版本,提出选型建议:其纯库、无外部依赖、自动分页的特性完美契合船端离线与容器化需求;强调必须显式配置许可证(年收入<100万美元可免费商用);推荐内嵌中文字体以保证跨环境一致性;新版已解决原生库问题,支持Linux/musl镜像。最终结论:在版面精确控制、离线运行场景下,QuestPDF是.NET生态最可靠的选择。

2026-09-17 14:05:07 77

原创 ClosedXML 实战:.NET 10 下的 Excel 导入导出、单据报表与数据质量防线

在船舶物料管理场景中,Excel 是跨组织数据交换的事实标准。针对供应商报价单、收发存明细、盘点表等高频场景,项目选型基于法务合规与性能需求,最终采用 MIT 许可的 ClosedXML。其核心优势在于:支持文本类型读写(避免物料编码误转科学计数法)、全内存模型适配千行级报表、样式与公式处理完善。但需注意:不支持老 .xls、超大数据量易引发 OOM,且公式需预计算后写入。通过统一文本处理、流式导出、模板化设计,实现安全高效的数据交互,保障采购与法务零事故。

2026-09-17 14:04:19 157

原创 .NET 10 船端单机部署与离线升级实战:从闪退事故到无感回滚

船端部署需遵循十条铁律:永远使用 self-contained 单文件 + ReadyToRun,确保零依赖、快速启动;四目录分离,程序、数据、日志、备份独立;以 Windows Service 托管,支持自启与自动重启;通过命名 Mutex 保证单实例运行;启动时执行自检与原子迁移;升级包标准化并支持断点续传;采用 junction 切换实现原子更新;数据库仅允许向前迁移,旧版程序可降级只读运行。结合离线可观测性与灰度发布,有效规避因环境差异、断电、网络不稳定导致的部署失败。

2026-09-16 17:34:22 187

原创 .NET 10 双 Provider 测试体系实战:让 CI 的绿灯在船端和岸基都不撒谎

本文提供一套可直接用于 tests/ 目录的双 Provider 测试方案:以 SQLite in-process 为快速底座,Testcontainers SQL Server 为方言闸门,结合 WebApplicationFactory、FakeTimeProvider、Respawn 数据隔离、FsCheck 属性测试及 OpenAPI 快照,实现从领域逻辑到端到端的分层测试。强调避免 InMemory 提供程序误导,通过可注入时钟、Id 生成与假件设计提升可测性,辅以 15 条踩坑清单与 CI 分层

2026-09-16 17:33:26 135

原创 M4 实战:物料费用与成本核算——到岸价、费用分摊、移动均价与多币种汇兑

成本分摊是典型的"给定输入、唯一输出、不碰数据库、不依赖时钟"的领域规则。同一份输入永远得到同一份结果(审计可复算)、单元测试不需要任何 mock、重算历史批次时和当年算出的数完全一致。/// <summary>采购收货行输入(来自 M2 PO 行 + M3 实收数量)。init;init;} // M3 批次号,FIFO 要用init;} // 订单数量(部分到货分摊基数)init;} // 本批实收数量init;

2026-09-15 14:18:26 186

原创 SQLite 船端运维实战:WAL / 备份 / 加密与损坏恢复

本文基于三起船端SQLite真实事故,系统阐述SQLite在船舶环境下的核心运维策略:强制启用WAL模式与synchronous=NORMAL保障断电不损坏;通过auto_vacuum=INCREMENTAL和定期VACUUM INTO控制文件体积;严禁使用File.Copy备份或手动删除-wal/-shm文件;采用SQLCipher结合DPAPI实现整库加密防泄露;强调所有连接级参数(如synchronous、busy_timeout)需在每次连接时重设。全文贯穿“持久化配置”与“连接级管理”的工程铁律,

2026-09-15 14:17:26 191

原创 ASP.NET Core 统一错误处理实战:IExceptionHandler + ProblemDetails(RFC 9457)守住 HTTP 边界

本文通过一起船员平板因409冲突误报500的事故,揭示了错误处理混乱带来的严重后果:响应格式不统一、监控失效、前端难以维护。提出以错误分类学为基础,按语义区分4xx/5xx,采用RFC 9457标准ProblemDetails统一错误契约,确保机器可读、文档可见、日志精准。强调“4xx不打堆栈、5xx必打堆栈”“错误码优于文案”“统一响应体”三大铁律,实现可观测性与客户端友好性的平衡。

2026-09-14 12:13:50 97

原创 库存交易与出入库流水——不可变流水与余额物化

M3库存系统以“流水不可变、余额可重建、变动有单据”为铁律,采用追加式流水账与物化余额结合的模式。通过不可变的StockTransaction记录每笔出入库,确保审计可溯;StockBalance作为流水投影的快照,仅由事务过账生成,禁止直接更新;借助领域服务StockLedger实现流水与余额的原子化操作,并通过四层防线(幂等、版本号、约束、事务)防范并发与负库存。该设计支持船岸对账、成本核算与数据重建,彻底解决老系统“数字对不上”的根本问题。

2026-09-14 12:13:05 82

原创 M2 实战:询价与采购订单聚合落地——跨聚合一致性、领域事件与 Outbox

本文以三起采购事故为引,揭示老系统建模缺陷:重复下单、超量未控、草价转单。提出M2模块的DDD重构方案:将Inquiry(含多供应商报价)与PurchaseOrder独立为聚合,确保比价与订单生命周期分离;通过领域服务实现船端强一致校验,岸基用事件驱动最终一致;以充血模型、幂等机制与Outbox模式保障跨聚合一致性,实现状态机驱动、规则内聚的可靠采购流程。

2026-09-13 22:15:53 193

原创 船舶跨时区时间处理实战:DateTimeOffset、TimeProvider 与“船钟“建模

本文以真实事故切入,揭示DateTime类型因缺乏时区语义导致的审批倒挂与夏令时错乱问题。核心指出:DateTime.Kind仅为2比特标记,比较时完全忽略时区,引发跨时区排序错误。强调应统一使用UTC存储、带偏移的DateTimeOffset进行跨时区比较,并通过TimeProvider提升可测性。针对船舶等复杂场景,提出“船时”建模思想,以ShipClock值对象实现历史时区还原,确保业务时间一致性。

2026-09-13 22:14:41 375

原创 EF Core 查询性能深度实战:一个列表页 1200 条 SQL 是怎么炼成的

本文以两个典型性能问题开篇:8秒列表页因N+1查询引发1200+条SQL,以及30万行数据下全量拉取导致内存溢出。通过开启EF Core日志、分析执行计划,揭示了懒加载、无索引扫描、内存过滤等深层问题。提出“看见→定位→修复→验证”四步性能治理闭环,强调必须基于实际SQL与执行计划优化,而非凭感觉加AsNoTracking。核心方法包括预加载、投影筛选、索引优化、分页与聚合下推,最终实现查询从慢到快的质变。

2026-09-12 19:31:26 609

原创 DDD 值对象与强类型 ID 实战:让编译器替你盯审批、盯币种、盯单号

本文以三个因“原语执念”导致的线上事故为引,揭示使用 Guid、string、decimal 等原始类型表示领域概念的隐患。提出通过强类型 ID与值对象建模,实现“使非法状态不可表示”:值对象不可变、构造时校验不变量,确保语义安全;在 EF Core 10 中,推荐使用 ComplexProperty(取代旧版 Owned)实现真正按值比较的持久化。全篇强调:用领域语义封装原始类型,可将运行时错误提前至编译期,且对数据库零影响,支持渐进重构。

2026-09-12 19:30:38 547

原创 船岸数据同步链路实战:SendFlag、单调版本号与断网三天后的续传

协议再严密,也要假设「总有消息会神秘失踪」(死信、人工误删、数据库文件损坏后还原)。对账(Reconciliation)就是定期把两岸的版本水位摊开比一遍。// 岸基对账接口:船端上报各聚合最大版本,岸基比差距IReadOnlyList<MissingRange> MissingOnShore, // 船有岸无:船端补推// 岸有船无:船端拉取// 岸基 Application/Sync/ReconcileService.cs// 船端版本更高 → 岸基漏了。

2026-09-12 19:29:43 196

原创 EF Core 迁移实战:数据库 Schema 的版本演进、双 Provider 与船端断网升级

本文复盘一次船端升级失败事故,揭示EnsureCreated在生产环境的致命缺陷:无版本管理,无法增量更新数据库。对比指出,EF Core Migrations才是承载真实数据、支持可追溯演进的正确方案。文章系统讲解迁移机制、工作流、SQL生成、SQLite限制、事务边界及数据迁移陷阱,并提出双Provider策略与船端断网自迁移设计,最终实现迁移链可重放、快照零漂移的工程化实践。

2026-09-12 19:20:15 183

原创 C# 14 / .NET 10 LTS 新特性机制深度:扩展成员、field 转正、EF Core 10 与船端升级实战

.NET 10 升级引发 CI 脚本故障,根源为 dotnet new sln 默认生成 .slnx 新格式,取代旧版 .sln。此变更终结了二十年的 GUID 风暴,提升可读性与工具兼容性。作为新 LTS 版本,.NET 10(C# 14、EF Core 10)强制要求生产环境升级,2026 年底前必须完成迁移。建议提前全局排查硬编码路径,统一使用 .slnx 并更新脚本,确保持续集成稳定。

2026-09-10 14:05:58 289

原创 EF Core 持久化 DDD 聚合实战:让充血模型乖乖落库

本文深入探讨充血聚合在EF Core中的实现难题,揭示“私有构造、私有集合、私有Setter”与ORM映射之间的阻抗失配。通过物料申请聚合的实战案例,详解构造函数绑定、后备字段映射、属性物化、查询过滤器及SaveChanges拦截等五大机制,揭示EF Core如何在封装下“无中生有”构建对象,并总结软删除陷阱、状态机并发、双数据库策略与测试分层等关键实践,提供可落地的持久化映射速查表与Checklist。

2026-09-10 14:05:16 400

原创 工作流组件怎么选:使用场景拆解与 .NET 入门示例

本文对比了Elsa Workflows、Workflow Core、Temporal、Camunda 8与jeeflow五类工作流引擎,按“.NET原生性”与“是否为独立平台”分类,明确其适用场景:Elsa与Workflow Core适合嵌入.NET应用的轻量流程编排;Temporal擅长高可靠微服务编排;Camunda 8适配企业级BPMN流程治理;jeeflow虽无.NET支持,但其轻量审批设计可作自研参考。选型需先厘清流程类型(人工/技术/自动化)、建模者(开发者/业务)及运行环境,避免错配。附各引擎

2026-09-09 12:18:14 450

原创 ASP.NET Core BackgroundService 生命周期深度实战:启动顺序、异常语义、优雅停止与后台任务治理

本文深入剖析 BackgroundService 的底层机制,揭示 ExecuteAsync 抛异常的演化行为(.NET 6+ 会终止进程)、StopAsync 的默认实现陷阱及数据丢失根源。通过真实事故案例,说明停止信号传播链路、取消令牌作用时机与中间状态持久化缺失问题,强调必须在循环中妥善处理异常、合理重试,并通过健康检查监控运行状态,避免“看似正常却已失效”的隐性故障。

2026-09-09 12:05:26 184

原创 ASP.NET Core Options 模式与配置体系深度实战:强类型绑定、启动校验、热更新与船端配置下发

配置是系统中最易出错的“代码”——无编译检查、无测试、改了不需重启,却常成生产事故元凶。一次误将轮询间隔从30秒改为3秒,致卫星流量费飙升11倍,暴露配置管理三大痛点:魔法字符串、缺乏校验、热更新缺失。通过引入Options模式,将配置强类型化,结合DataAnnotations与自定义验证,实现启动即校验(ValidateOnStart),让非法配置在部署阶段就被拦截。配合IOptionsMonitor实现热更新,彻底杜绝“合法但荒谬”的配置上线。

2026-09-09 12:04:54 103

原创 ASP.NET Core 健康检查探针实战:Liveness/Readiness 语义、依赖分级与船端断网哲学

try// 轻量探活,别跑 SELECT *,也别在检查里开事务// 本地 SQLite 打不开 = 数据文件损坏/磁盘故障 → 重启可能修复,Unhealthy 合理return HealthCheckResult.Unhealthy("本地数据库不可用", ex);// <2GB 降级(Outbox 还能写但该告警),<500MB 不健康(随时写满崩溃)< 0.5 => HealthCheckResult.Unhealthy($"磁盘剩余freeGbF2GB"),

2026-09-08 17:03:04 155

原创 C# 12 / .NET 9 新特性机制深度:编译器替你写了什么,哪些糖吃下去会出事

C# 12/13 新语法分“纯语法糖”和“改变 IL”两类。集合表达式、主构造函数、field 关键字、Span/InlineArray 等为热路径带来性能提升但也有边界。编译器展开规则决定分配与GC行为,需避免 IEnumerable spread 动态扩容。主构造函数不生成 public 属性,span 参数不可

2026-09-08 17:02:33 155

原创 System.Threading.Channels 高性能管道实战:背压、批处理与船端事件流

写库与发消息无法同时成功导致数据不一致。Outbox模式将事件写入同库事务,通过后台中继投递,保证不丢;消费端幂等避免重复。.NET CAP框架内置此机制,简化实现。

2026-09-07 12:23:14 238

软件开发 - C# WinForms - 文件扫描与MD5校验工具 - 完整源码

软件开发 - C# WinForms - 文件扫描与MD5校验工具 - 完整源码

2026-04-25

软件开发 - C# WinForms - 文件夹递归扫描与树形大小分析 - 完整源码+教程

本资源提供了一套完整的 C# WinForms 应用程序源码及配套博文,实现了一个具有树形结构的 C盘文件夹大小分析工具。程序能够以树形视图(TreeView)递归展示C盘任意深度的目录结构,并异步计算每个文件夹的总大小(包含所有子文件和子文件夹),界面始终保持流畅响应。同时支持右键删除文件夹(安全移至回收站)、单项/批量刷新大小、取消正在进行的计算任务等实用功能。 核心亮点 动态按需加载:节点展开时才枚举子文件夹,避免一次性全盘扫描造成的卡顿。 高效异步递归:文件夹大小计算在后台线程执行(Task.Run),UI实时更新状态,并支持CancellationToken友好取消。 安全删除机制:调用Microsoft.VisualBasic.FileIO将文件夹移至回收站,可随时还原。 完善的异常处理:自动跳过无权限的系统目录(如System Volume Information),显示友好提示而不崩溃。 适合人群 希望学习 C# + WinForms 文件系统操作的开发者。 需要监控磁盘空间、清理缓存文件夹的系统维护人员。 对 异步编程(async/await)、递归算法、TreeView动态加载有实践需求的学员。 资源包含内容 完整的 Form1.cs 源码(可直接编译运行)。 详细的技术博文(涵盖设计思路、代码解析、注意事项)。 使用 .NET 8 环境,添加 Microsoft.VisualBasic 引用即可运行。 无论是作为日常工具还是学习项目,这套代码都能帮助你快速掌握文件夹遍历、异步计算和树形控件的高级交互。

2026-04-24

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除