开发手记 · 第 10 / 11 篇 合集目录 ‹ 上一篇 下一篇 ›

工业数据 WebApi 这套平台里,最让我放心的是它的"水电煤气"是分开走的。

所谓水电煤气,是指 ORM、缓存、加密、配置、日志这几类基础设施。早年这些能力常散在业务里,换一个缓存要改十几个模块,漏一处就出诡异的 bug。我早年就为这种散落吃过苦头,改到手软还漏了三处。在 Frames 目录里,它们现在各自是一个独立的 frame:ORM 是 NetORMCore.SqlSugar,缓存是 CacheManagerCore,加密是 Encrypt 那一支,配置是 Configure,日志是 LoggingCore。每一类只管自己的事,对外只露一个干净的入口。

(等价改写,名字换掉了)业务里调用它们的样子是各取所需、互不串门:

var conn = Configure.Core.Get("repo:primary");        // 配置
var data = CacheManager.Core.GetOrAdd(key, () => ...); // 缓存
Logging.Core.Info("provider loaded");                 // 日志

它为什么重要

分开走,意味着一种基础设施的写法变动,不会渗到另一种里面。加缓存不用动日志,换加密算法不用碰配置。每一根管都只接自己的表,谁也不往谁的管线里灌脏数据或隐式依赖。比如日志,业务只调 Logging.Core.Info,至于它落文件还是落远程,业务不知道;哪天换日志后端,只动 LoggingCore 一间。业务方完全无感,这才是分层该有的样子。

代价换来的是清爽

代价是"管"多了,接入时要清楚自己在用哪一根。但换来的是排查问题时能顺着一根管追到底,不会因为日志里混了缓存逻辑而迷路。我见过把缓存写进业务、把加解密揉进数据访问的项目,那种代码一升级就浑身疼。这里每根管独立,单测也能各自打桩。哪天要换掉某一个基础设施,影响的面被这根管子限定死了,不怕牵一发动全身。

分层不是为了好看。它让"基础设施"真正成为可以整体替换的零件,而不是焊死在业务里的习惯。站在这套约 59 万行 C# 的体量上看,把水电煤气分清楚,是它还能稳步长大的底气之一。这种清爽,是大规模协作最稀缺的东西。