using System.Reflection; using GFramework.Cqrs.Abstractions.Cqrs; namespace GFramework.Cqrs; /// /// 描述单个 stream request/response 类型对在运行时建流时需要复用的元数据。 /// /// 当前流式请求处理器在容器中的服务类型。 /// /// 执行单个流式请求处理器的开放静态方法。 /// dispatcher 会在首次创建 stream binding 时,把该方法绑定成内部使用的调用委托。 /// /// /// dispatcher 仍会负责上下文注入; /// 该描述符只前移流式请求处理器服务类型与直接调用方法元数据。 /// public sealed class CqrsStreamInvokerDescriptor( Type handlerType, MethodInfo invokerMethod) { private static readonly string NonStaticInvokerMessage = "CQRS stream invoker descriptors require an open static invoker method so generated metadata can be bound deterministically."; /// /// 获取流式请求处理器在容器中的服务类型。 /// public Type HandlerType { get; } = handlerType ?? throw new ArgumentNullException(nameof(handlerType)); /// /// 获取执行流式请求处理器的开放静态方法。 /// public MethodInfo InvokerMethod { get; } = ValidateInvokerMethod(invokerMethod); /// /// 在描述符构造阶段拒绝实例方法,避免非法 generated metadata 延迟到首次建流时才暴露。 /// /// 待验证的 generated invoker 方法。 /// 通过校验的静态方法。 /// 时抛出。 /// 不是静态方法时抛出。 private static MethodInfo ValidateInvokerMethod(MethodInfo invokerMethod) { ArgumentNullException.ThrowIfNull(invokerMethod); if (!invokerMethod.IsStatic) throw new ArgumentException(NonStaticInvokerMessage, nameof(invokerMethod)); return invokerMethod; } }