防腐层
防腐层在系统或限界上下文之间翻译模型与语义,避免外部概念直接进入内部领域。
#growing
#concept
#dev
[!info] related notes
防腐层 Anti-Corruption Layer
防腐层(Anti-Corruption Layer,ACL)在内部模型与外部系统或另一限界上下文之间提供语义转换,避免内部业务被迫采用外部的概念、状态和规则。
这里的 ACL 不是网络安全中的 Access Control List。
翻译什么
内部领域 / 应用接口 ↔ 防腐层 ↔ 外部接口与模型
- 概念:外部的用户、账户、交易在内部可能有不同职责。
- 单位与表示:金额最小单位、币种、时间戳单位、时区与标识符。
- 状态与错误:外部成功、处理中、拒绝、超时如何映射到内部可处理的结果。
- 调用协议:认证、请求格式、重试约束等留在集成边界,业务仍需处理真实的失败和不确定性。
可以组合 Facade、Adapter、Translator 实现,也可以是一个小模块;不要求每个角色都创建独立类。
支付映射例子
假设外部接口明确定义 status_code=1 为已成功,0 为已失败,另有处理中状态,并使用整数最小货币单位:
| 外部证据 | 内部处理 |
|---|---|
| 明确成功状态和交易 ID | 映射为成功结果,并保留可追踪 ID |
| 明确失败状态 | 映射为失败结果及可处理原因 |
| 处理中 | 映射为待确认,不能直接视为成功或失败 |
| 未识别状态、缺字段、金额单位不符 | 拒绝或记录为集成错误,不默认归为业务失败 |
| 请求超时 | 标记结果未知并按协议查询或对账,不据此判定没有扣款 |
金额转换需明确币种与最小单位,避免用浮点数承载精确金额。创建支付意图或拿到一个 ID 不等于扣款成功;重复调用还需业务幂等约束。
这个例子描述转换责任,不是某个支付 SDK 的可执行实现。
使用边界
- 适合模型差异明显、遗留系统或外部契约可能侵入内部模型的集成。
- 简单字段转发、工具库包装和 Repository 不自动等于 DDD 防腐层;关键在于是否隔离了语义差异。
- API Gateway 侧重统一流量入口,BFF 侧重客户端适配,ACL 侧重模型翻译;不能仅用“入口 / 出口方向相反”区分。
- 可部署为模块或独立服务,取决于共享、扩缩容和运维需求。额外延迟与故障点需测量,不能预设可忽略。
- ACL 降低变化传播,不保证外部改变业务语义后内部完全无需调整。