GFramework/GFramework.Cqrs/CqrsReflectionFallbackAttribute.cs
GeWuYou 391e3e9813 feat(cqrs): 添加CQRS处理器自动注册功能
- 实现CqrsHandlerRegistrar类,支持扫描并注册CQRS请求/通知/流式处理器
- 添加源码生成注册器优先策略,减少冷启动时的反射开销
- 实现运行时反射扫描回退机制,确保处理器注册的完整性
- 添加CqrsReflectionFallbackAttribute特性,标记需要运行时补充扫描的程序集
- 创建完整的单元测试套件,验证处理器注册顺序与容错行为
- 实现CqrsHandlerRegistryGenerator源码生成器,自动生成处理器注册代码
- 添加详细的日志记录与诊断功能,便于调试注册过程
- 实现类型安全的处理器映射验证与重复注册检测机制
2026-04-16 11:11:29 +08:00

37 lines
1.5 KiB
C#

namespace GFramework.Cqrs;
/// <summary>
/// 标记程序集中的 CQRS 生成注册器仍需要运行时补充反射扫描。
/// </summary>
/// <remarks>
/// 该特性通常由源码生成器自动添加到消费端程序集。
/// 当生成器只能安全生成部分 handler 映射时,运行时会先执行生成注册器,再补一次带去重的反射扫描,
/// 以覆盖那些生成代码无法直接引用的 handler 类型。
/// </remarks>
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class CqrsReflectionFallbackAttribute : Attribute
{
/// <summary>
/// 初始化 <see cref="CqrsReflectionFallbackAttribute" />。
/// </summary>
/// <param name="fallbackHandlerTypeNames">
/// 需要运行时补充反射注册的处理器类型全名。
/// 当该清单为空时,运行时会回退到整程序集扫描,以兼容旧版 marker 语义。
/// </param>
public CqrsReflectionFallbackAttribute(params string[] fallbackHandlerTypeNames)
{
ArgumentNullException.ThrowIfNull(fallbackHandlerTypeNames);
FallbackHandlerTypeNames = fallbackHandlerTypeNames
.Where(static typeName => !string.IsNullOrWhiteSpace(typeName))
.Distinct(StringComparer.Ordinal)
.OrderBy(static typeName => typeName, StringComparer.Ordinal)
.ToArray();
}
/// <summary>
/// 获取需要运行时补充反射注册的处理器类型全名集合。
/// </summary>
public IReadOnlyList<string> FallbackHandlerTypeNames { get; }
}