Skip to content
bitzorcas
中EN

Concept

ADR 0103:源生成器替代运行时反射

DI 注册、端点、校验、JSON context、ORM 配置、query shape 与模块清单默认走源生成;运行时反射仅作为已登记的迁移例外。

Last updated

状态

Accepted(Revised,2026-07-28)。

背景

运行时 assembly 扫描、属性反射、动态泛型创建与运行时表达式映射扩大了 trim 风险,并把架构错误推到启动期或请求时。旧模板把机械发现留给运行时,导致 AOT 豁免膨胀、遗漏注册,以及保护手写文件形状而非不变量的测试。

决策

源生成器优先。 DI 注册、端点路由、校验规则、JSON context、DTO 投影、QueryShape、标准 list-query plan、ORM Fluent config 与模块清单默认走源生成或显式生成条目。运行时反射仅作为已登记的迁移例外被允许。

已在使用的生成器:Mapperly、Mediator.SourceGenerator、System.Text.Json SG、ORM Fluent Configuration Generator、QueryShape Generator,以及 DI/Endpoint/Validation 生成器。ORM Fluent Configuration Generator 在编译期读取与提供方无关的 [BitzTable]/[BitzColumn]/[BitzIndex] 元数据,生成 EF Core IEntityTypeConfiguration<T> 与 SqlSugar 静态 Fluent 映射。禁止运行时反射扫描聚合属性并构建 ORM 映射;默认的聚合↔entity 映射器不再生成。

API Host 的 JSON 根契约由 build-only JSON Contract Compiler 在 CoreCompile 前语义聚合,再交给官方 System.Text.Json SG。发现来源不限于 [GenerateEndpoint],还包括手写 Minimal API、自定义 Map 扩展、ASP.NET IResult 工厂和 Host HTTP JSON 调用;不得维护框架方法名、产品程序集前缀或全局 [JsonSerializable] 清单。模块私有的持久化、签名、令牌与外部协议仍使用小型局部 Context,并在调用点显式传 JsonTypeInfo。

硬门禁(REQ-GATE-001)阻断 Assembly.GetTypes()、GetCustomAttributes()、Activator.CreateInstance()、MakeGenericType()、GetMethod()/Invoke()、运行时 Query-attribute 反射与运行时持久化元数据 ORM 映射——除非登记为 AOT-EXEMPT,否则全部 P0。唯一例外是 Mediator PipelineBehaviors 顺序,它保持显式(ADR 0401)且不自动注册。

后果

AOT/Trim 安全性提升,样板代码减少,架构错误前移到编译期。Host 启动更轻、更可预测。代价是生成器数量与复杂度:快照测试、语义测试与 IDE 刷新维护;QueryStore 逃生舱覆盖生成器无法表达的查询。

另见

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%