GFramework/GFramework.Cqrs/CqrsReflectionFallbackAttribute.cs
GeWuYou 06f95db593 feat(cqrs): 添加CQRS调度器实现和改进处理器注册机制
- 实现GFramework自有CQRS运行时分发器,支持请求/通知/流式请求处理
- 添加进程级缓存机制优化反射调用性能,包括请求、通知、流水线调用委托缓存
- 重构CqrsHandlerRegistrar使用ReflectionFallbackMetadata替代字符串类型名
- 引入CqrsReflectionFallbackAttribute支持运行时补充反射扫描的处理器类型
- 添加完整的CQRS处理器注册单元测试,验证有序执行和容错行为
- 修复MicrosoftDiContainer中异常消息的格式化空白问题
- 实现上下文感知处理器的CQRS分发上下文注入功能
2026-04-16 11:36:31 +08:00

72 lines
2.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

namespace GFramework.Cqrs;
/// <summary>
/// 标记程序集中的 CQRS 生成注册器仍需要运行时补充反射扫描。
/// </summary>
/// <remarks>
/// 该特性通常由源码生成器自动添加到消费端程序集。
/// 当生成器只能安全生成部分 handler 映射时,运行时会先执行生成注册器,再补一次带去重的反射扫描,
/// 以覆盖那些生成代码无法直接引用的 handler 类型。
/// </remarks>
[AttributeUsage(AttributeTargets.Assembly)]
public sealed class CqrsReflectionFallbackAttribute : Attribute
{
/// <summary>
/// 初始化 <see cref="CqrsReflectionFallbackAttribute" />,保留旧版“仅标记需要补扫”的语义。
/// </summary>
public CqrsReflectionFallbackAttribute()
{
FallbackHandlerTypeNames = [];
FallbackHandlerTypes = [];
}
/// <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();
FallbackHandlerTypes = [];
}
/// <summary>
/// 初始化 <see cref="CqrsReflectionFallbackAttribute" />。
/// </summary>
/// <param name="fallbackHandlerTypes">
/// 需要运行时补充反射注册的处理器类型。
/// 该重载适合手写或第三方程序集显式声明可直接引用的 fallback handlers
/// 避免再通过字符串名称回查程序集元数据。
/// </param>
public CqrsReflectionFallbackAttribute(params Type[] fallbackHandlerTypes)
{
ArgumentNullException.ThrowIfNull(fallbackHandlerTypes);
FallbackHandlerTypeNames = [];
FallbackHandlerTypes = fallbackHandlerTypes
.Where(static type => type is not null)
.Distinct()
.OrderBy(static type => type.FullName ?? type.Name, StringComparer.Ordinal)
.ToArray();
}
/// <summary>
/// 获取需要运行时补充反射注册的处理器类型全名集合。
/// </summary>
public IReadOnlyList<string> FallbackHandlerTypeNames { get; }
/// <summary>
/// 获取可直接供运行时补充反射注册的处理器类型集合。
/// </summary>
public IReadOnlyList<Type> FallbackHandlerTypes { get; }
}