Skip to content

诊断

DesignPatterns 源生成器与分析器发出的编译器诊断。ID 定义于 DesignPatterns.Diagnostics.DiagnosticIds

IDE 帮助链接指向本页(#dp### 锚点)。

Singleton(DP001–DP002)

ID级别触发条件
DP001Error[GenerateSingleton] 目标不是 partial
DP002Error无效的单例目标

Strategy(DP003–DP007)

ID级别触发条件
DP003Error策略 Key 重复
DP004Error实现与策略契约不匹配
DP006Info实现类型未用 [RegisterStrategy] 注册
DP007Error缺少无参构造函数

责任链(DP005、DP008–DP009、DP024)

ID级别触发条件
DP005Error[HandlerOrder] 顺序重复
DP008ErrorHandler 未实现管道契约
DP009ErrorHandler 缺少无参构造函数
DP024InfoHandler 未用 [HandlerOrder] 注册

Composite(DP010–DP015)

ID级别触发条件
DP010ErrorComposite 部件 Key 重复
DP011Error未知父 Key
DP012Error树结构存在环
DP013Error部件与节点契约不匹配
DP014Error部件缺少无参构造函数
DP015Error注册表持有者缺少 [CompositeBuildable]

Decorator(DP016–DP019)

ID级别触发条件
DP016ErrorDecorator 顺序重复
DP017ErrorDecorator 与契约不匹配
DP018Error未实现 IDecorator<T>
DP019ErrorDecorator 缺少无参构造函数

Factory Registry(DP020–DP023)

ID级别触发条件
DP020ErrorFactory Key 重复
DP021ErrorFactory 与产品契约不匹配
DP022ErrorFactory 缺少无参构造函数
DP023Info产品类型未用 [RegisterFactory] 注册

注册表 Key(DP025)

ID级别触发条件
DP025Info传入生成 Strategy / Factory 注册表查找的字符串字面量 key 不在已注册列表中

作用范围: IStrategyRegistry<,> / IFactoryRegistry<,>Get / TryGet / Create / TryCreate,且 key 参数为字符串字面量(非 {Contract}Keys 常量)。

消息: 包含契约类型与已注册 key 列表。

修复: 优先使用 {Contract}Keys.*。拼写接近已知 key 时,CorrectRegistryKey CodeFix 可替换为最近键。

另见 注册表 Key 命名约定

插件程序集(DP033)

ID级别触发条件
DP033Error同一契约的相同 strategy key多个被引用的供应商程序集中重复注册

作用范围: 宿主编译引用多个插件供应商程序集,且对同一契约使用了相同的 [RegisterStrategy] key。

消息: 包含 key、契约类型与冲突程序集名称。

修复: 各供应商使用不同 key,或每个契约维度只引用一个供应商。单程序集内重复 key 仍由 DP003(生成器)报告。

插件程序集示例、主仓 PluginAssemblies.md,以及本站配置桥接

State 转换表(DP026–DP031)

ID级别触发条件
DP026Error(from state, trigger) 边重复
DP027Error[Transition] 的 state 非 enum 成员
DP028Errortrigger 非 enum 成员
DP029Error[StateMachine]Initial 非 state enum 成员
DP030Errorholder 不是 static partial class
DP031Infostate enum 成员从未作为 [Transition] 的 from(终态提示)

State 转换表

State guard(DP032、DP034–DP035)

ID级别触发条件
DP032Error[Transition(Guard = nameof(Method))] guard 方法在 holder 类上未找到
DP034Errorguard 方法非 static(防御性 — C# 编译器先于生成器拒绝 static 类的实例方法)
DP035Errorguard 方法签名错误(须为 static bool Method(TState, TTrigger)

State 字面量边(DP036)

ID级别触发条件
DP036InfoTryTransition 以字面量 (state, trigger) 调用,但未匹配任何 [Transition] 声明的边

State entry/exit action(DP037–DP039)

ID级别触发条件
DP037Error[Transition(OnEnter/OnExit = nameof(Method))] action 方法在 holder 类上未找到
DP038Erroraction 方法非 static(实际不可达 — CS0708 先触发;保留供完整性)
DP039Erroraction 方法签名错误(须为 static void Method(TState, TState, TTrigger)static ValueTask Method(TState, TState, TTrigger, CancellationToken)

Composite DI + Visitor(DP040–DP041)

ID级别触发条件
DP040ErrorBuildRoot(IServiceProvider) 调用时 composite 节点未注册到容器
DP041Info生成的 I{Contract}NodeVisitor 未覆盖所有节点类型(保留 ID — C# 编译器通过接口实现 CS0535 自动强制覆盖,诊断不实际触发)

Decorator DI + async(DP042–DP043)

ID级别触发条件
DP042Errorasync decorator 方法签名错误(DecorateAsync 须返回 ValueTask<TService>
DP043Errorasync decorator 在 Build(IServiceProvider, core) 时无法从 DI 解析

EventAggregator(DP044–DP046)

ID级别触发条件
DP044Info类型实现 IEventHandler<T> 但未标注 [RegisterEventHandler]
DP045Error同一 handler 对同一 event type 重复标注 [RegisterEventHandler]
DP046Error类型标注了 [RegisterEventHandler<T>] 但未实现 IEventHandler<T>

Strategy guard(DP047–DP049)

ID级别触发条件
DP047Error[RegisterStrategy(Guard = nameof(Method))] guard 方法在策略类上未找到
DP048Errorguard 方法非 static
DP049Errorguard 方法签名错误(须为 static bool Method(TKey)

Handler guard(DP050–DP052)

ID级别触发条件
DP050Error[HandlerOrder(Guard = nameof(Method))] guard 方法在 handler 类上未找到
DP051Errorguard 方法非 static
DP052Errorguard 方法签名错误(须为 static bool Method(TContext)

Factory async + 池化(DP053–DP055)

ID级别触发条件
DP053Error[RegisterFactory(IsAsync = true)] 但工厂未实现 IAsyncFactory<T>
DP054ErrorPoolSize 为负数(须 ≥ 0;0 禁用池化)
DP055WarningPoolSize > 1024(可能导致内存占用过高)

State 层级(DP056–DP059)

ID级别触发条件
DP056ErrorState 层级存在环
DP057Error[StateParent] 引用了 state enum 中不存在的成员
DP058Error[StateParent] 将 state 声明为自身的 parent
DP059Info声明为 parent 的 state 没有子状态或出边

DI 生命周期(DP060–DP062)

ID级别触发条件
DP060Warning生成注册表的生命周期长于实现类型,可能捕获短生命周期服务
DP061Info实现类型的生命周期长于注册表,可能产生不必要的实例
DP062WarningSingleton 服务依赖 Scoped 或 Transient 服务

Composite 树约束(DP063–DP065)

ID级别触发条件
DP063WarningComposite 树超过 [CompositeSchema] 声明的 MaxDepth
DP064ErrorComposite 子类型未列入父节点的 AllowedChildTypes
DP065WarningComposite 契约的节点数超过 [CompositeSchema] 声明的 MaxNodes

Singleton 生命周期(DP066–DP071)

ID级别触发条件
DP066WarningSingleton 工厂委托解析 Scoped 或 Transient 服务并将其捕获
DP067ErrorGenerateSingleton 异步初始化器缺失、非静态或 Task/ValueTask 签名错误
DP068Warning生成的 Singleton 同时注册为 DI Singleton,形成两个生命周期所有者
DP069Info非线程安全的生成 Singleton 包含可变实例状态
DP070Info检测到可变静态 Singleton 状态,建议使用不可变 Lazy Singleton 或 DI
DP071Warning可变静态 Singleton 状态同时注册为 DI Singleton

CodeFix

DesignPatterns.CodeFixesSkymly.DesignPatterns 元包分发(analyzers/dotnet/cs)。下列诊断支持 IDE 一键修复(需 C# Workspaces):

诊断CodeFix(摘要)
DP006添加 [RegisterStrategy("key", typeof(TContract))]
DP023添加 [RegisterFactory("key", typeof(TContract))]
DP024添加 [HandlerOrder(order, typeof(TContext))]
DP025将字面量替换为最近注册 key
DP001添加 partial
DP015添加 [CompositeBuildable]
DP004 / DP013 / DP017 / DP021补全契约实现
DP007 / DP009 / DP014 / DP019 / DP022添加无参构造函数

生成器 Error(如 DP003、DP020 重复 key)需改 attribute 或类型;不提供 CodeFix。

类别前缀:DesignPatterns

英文完整版:Diagnostics

基于 MIT 许可证发布。