GFramework/GFramework.Cqrs.SourceGenerators
gewuyou 6d4f9f2f94 fix(source-generators): 收口PR269生成器评审修复
- 重构 CqrsHandlerRegistryGenerator 为按职责拆分的 partial 生成器文件,保留现有注册输出与 fallback 契约
- 修复 ContextAwareGenerator 生成字段命名冲突并为 SetContextProvider 补充运行时 null 校验与异常文档
- 补充 Option<T> 的 XML remarks 契约说明与 ContextAwareGenerator 字段冲突快照测试
- 更新 analyzer-warning-reduction 跟踪与 trace,记录 PR #269 review follow-up 与验证结果
2026-04-23 09:58:30 +08:00
..

GFramework.Cqrs.SourceGenerators

GFramework.Cqrs.SourceGenerators 用于在编译期为当前业务程序集生成 CQRS handler registry减少运行时程序集扫描与反射注册成本。

模块定位

这个包是编译期生成器,不是运行时消息或处理器库。

生成器会分析当前业务程序集中的:

  • IRequestHandler<,>
  • INotificationHandler<>
  • IStreamRequestHandler<,>

并生成:

  • ICqrsHandlerRegistry 实现
  • 程序集级 CqrsHandlerRegistryAttribute
  • 必要时的 CqrsReflectionFallbackAttribute 元数据

包关系

  • 运行时:GFramework.Cqrs
  • 契约层:GFramework.Cqrs.Abstractions
  • 生成器:GFramework.Cqrs.SourceGenerators

不安装这个包也可以正常使用 CQRS区别只在于运行时会更多依赖反射扫描注册 handlers。

当前代码入口

仓库内该包的主要实现位于:

  • Cqrs/CqrsHandlerRegistryGenerator.cs

它会在可以安全生成静态注册器时前移注册工作;对无法由生成代码直接引用的 handler则通过 reflection fallback 元数据让运行时做定向补扫,而不是整程序集盲扫。

最小接入路径

<ItemGroup>
  <PackageReference Include="GeWuYou.GFramework.Cqrs" Version="x.y.z" />
  <PackageReference Include="GeWuYou.GFramework.Cqrs.Abstractions" Version="x.y.z" />
  <PackageReference Include="GeWuYou.GFramework.Cqrs.SourceGenerators"
                    Version="x.y.z"
                    PrivateAssets="all"
                    ExcludeAssets="runtime" />
</ItemGroup>

运行时侧仍按正常方式注册程序集:

RegisterCqrsHandlersFromAssembly(typeof(GameArchitecture).Assembly);

安装生成器后,运行时会优先走生成的 registry无法静态表达的部分再走定向回退。

什么时候值得安装

  • 你的业务程序集里 handler 数量较多
  • 你希望缩小冷启动时的反射扫描范围
  • 你需要把 handler 注册路径收束到编译期并保持可诊断

对应文档