GFramework/GFramework.Cqrs.SourceGenerators
gewuyou b8c2ad42a9 fix(cqrs-source-generators): 化解注册生成器文件级冲突
- 合并 main 在线上单文件版本新增的模型 XML 文档,并迁移到当前 partial 拆分后的 Models 文件

- 保留 CqrsHandlerRegistryGenerator 主文件的现有生成管线拆分,不回退已完成的结构调整

- 更新 analyzer-warning-reduction 跟踪与 trace,记录本轮冲突确认、合并策略与构建验证结果
2026-04-23 09:58:35 +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 注册路径收束到编译期并保持可诊断

对应文档