mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-06 16:16:44 +08:00
- 实现CqrsHandlerRegistrar类,支持扫描并注册CQRS请求/通知/流式处理器 - 添加源码生成注册器优先策略,减少冷启动时的反射开销 - 实现运行时反射扫描回退机制,确保处理器注册的完整性 - 添加CqrsReflectionFallbackAttribute特性,标记需要运行时补充扫描的程序集 - 创建完整的单元测试套件,验证处理器注册顺序与容错行为 - 实现CqrsHandlerRegistryGenerator源码生成器,自动生成处理器注册代码 - 添加详细的日志记录与诊断功能,便于调试注册过程 - 实现类型安全的处理器映射验证与重复注册检测机制
37 lines
1.5 KiB
C#
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; }
|
|
}
|