// 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);
}
}