// Copyright (c) 2025-2026 GeWuYou // SPDX-License-Identifier: Apache-2.0 using System; using System.Collections.Generic; using System.Reflection; using System.Threading; using GFramework.Core.Abstractions.Logging; using GFramework.Cqrs.Abstractions.Cqrs; using Microsoft.Extensions.DependencyInjection; [assembly: GFramework.Cqrs.CqrsHandlerRegistryAttribute( typeof(GFramework.Cqrs.Benchmarks.Messaging.GeneratedStreamLifetimeBenchmarkRegistry))] namespace GFramework.Cqrs.Benchmarks.Messaging; /// /// 为 stream 生命周期矩阵 benchmark 提供 hand-written generated registry, /// 以便在默认 generated-provider 宿主路径上比较不同 handler 生命周期的完整枚举成本。 /// public sealed class GeneratedStreamLifetimeBenchmarkRegistry : GFramework.Cqrs.ICqrsHandlerRegistry, GFramework.Cqrs.ICqrsStreamInvokerProvider, GFramework.Cqrs.IEnumeratesCqrsStreamInvokerDescriptors { private static readonly GFramework.Cqrs.CqrsStreamInvokerDescriptor Descriptor = new( typeof(IStreamRequestHandler< StreamLifetimeBenchmarks.BenchmarkStreamRequest, StreamLifetimeBenchmarks.BenchmarkResponse>), typeof(GeneratedStreamLifetimeBenchmarkRegistry).GetMethod( nameof(InvokeBenchmarkStreamHandler), BindingFlags.Public | BindingFlags.Static) ?? throw new InvalidOperationException("Missing generated stream lifetime benchmark method.")); private static readonly IReadOnlyList Descriptors = [ new GFramework.Cqrs.CqrsStreamInvokerDescriptorEntry( typeof(StreamLifetimeBenchmarks.BenchmarkStreamRequest), typeof(StreamLifetimeBenchmarks.BenchmarkResponse), Descriptor) ]; /// /// 参与程序集注册入口,但不在这里直接写入 handler 生命周期。 /// /// 当前 generated registry 拥有的服务集合。 /// 用于记录 generated registry 注册行为的日志器。 /// /// 生命周期矩阵需要让 benchmark 主体显式控制 `Singleton / Transient` 变量。 /// 因此 registry 只负责暴露 generated descriptor,不在这里抢先注册 handler,避免把默认单例注册混入比较结果。 /// public void Register(IServiceCollection services, ILogger logger) { ArgumentNullException.ThrowIfNull(services); ArgumentNullException.ThrowIfNull(logger); logger.Debug("Registered generated stream lifetime benchmark descriptors."); } /// /// 返回当前 provider 暴露的全部 generated stream invoker 描述符。 /// public IReadOnlyList GetDescriptors() { return Descriptors; } /// /// 为目标流式请求/响应类型对返回 generated stream invoker 描述符。 /// /// 待匹配的请求类型。 /// 待匹配的响应类型。 /// 命中时返回的 generated descriptor。 /// 命中当前 benchmark 的请求/响应类型对时返回 public bool TryGetDescriptor( Type requestType, Type responseType, out GFramework.Cqrs.CqrsStreamInvokerDescriptor? descriptor) { if (requestType == typeof(StreamLifetimeBenchmarks.BenchmarkStreamRequest) && responseType == typeof(StreamLifetimeBenchmarks.BenchmarkResponse)) { descriptor = Descriptor; return true; } descriptor = null; return false; } /// /// 模拟 generated stream invoker provider 为生命周期矩阵 benchmark 产出的开放静态调用入口。 /// /// 当前请求对应的 handler 实例。 /// 待分发的流式请求。 /// 调用方传入的取消令牌。 /// 交给目标 stream handler 处理后的异步枚举。 public static object InvokeBenchmarkStreamHandler( object handler, object request, CancellationToken cancellationToken) { var typedHandler = (IStreamRequestHandler< StreamLifetimeBenchmarks.BenchmarkStreamRequest, StreamLifetimeBenchmarks.BenchmarkResponse>)handler; var typedRequest = (StreamLifetimeBenchmarks.BenchmarkStreamRequest)request; return typedHandler.Handle(typedRequest, cancellationToken); } }