// 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;
namespace GFramework.Cqrs.Benchmarks.Messaging;
///
/// 为 benchmark 手写一个“生成后等价物” stream registry,用于驱动真实的 generated stream invoker provider 运行时接线路径。
///
public sealed class GeneratedStreamInvokerBenchmarkRegistry :
GFramework.Cqrs.ICqrsHandlerRegistry,
GFramework.Cqrs.ICqrsStreamInvokerProvider,
GFramework.Cqrs.IEnumeratesCqrsStreamInvokerDescriptors
{
private static readonly GFramework.Cqrs.CqrsStreamInvokerDescriptor Descriptor =
new(
typeof(IStreamRequestHandler<
StreamInvokerBenchmarks.GeneratedBenchmarkStreamRequest,
StreamInvokerBenchmarks.GeneratedBenchmarkResponse>),
typeof(GeneratedStreamInvokerBenchmarkRegistry).GetMethod(
nameof(InvokeGeneratedStreamHandler),
BindingFlags.Public | BindingFlags.Static)
?? throw new InvalidOperationException("Missing generated stream invoker benchmark method."));
private static readonly IReadOnlyList Descriptors =
[
new GFramework.Cqrs.CqrsStreamInvokerDescriptorEntry(
typeof(StreamInvokerBenchmarks.GeneratedBenchmarkStreamRequest),
typeof(StreamInvokerBenchmarks.GeneratedBenchmarkResponse),
Descriptor)
];
///
/// 将 generated benchmark stream handler 注册到目标服务集合。
///
public void Register(IServiceCollection services, ILogger logger)
{
ArgumentNullException.ThrowIfNull(services);
ArgumentNullException.ThrowIfNull(logger);
services.AddTransient(
typeof(IStreamRequestHandler<
StreamInvokerBenchmarks.GeneratedBenchmarkStreamRequest,
StreamInvokerBenchmarks.GeneratedBenchmarkResponse>),
typeof(StreamInvokerBenchmarks.GeneratedBenchmarkStreamHandler));
logger.Debug("Registered generated stream invoker benchmark handler.");
}
///
/// 返回当前 provider 暴露的全部 generated stream invoker 描述符。
///
public IReadOnlyList GetDescriptors()
{
return Descriptors;
}
///
/// 为目标流式请求/响应类型对返回 generated stream invoker 描述符。
///
public bool TryGetDescriptor(
Type requestType,
Type responseType,
out GFramework.Cqrs.CqrsStreamInvokerDescriptor? descriptor)
{
if (requestType == typeof(StreamInvokerBenchmarks.GeneratedBenchmarkStreamRequest) &&
responseType == typeof(StreamInvokerBenchmarks.GeneratedBenchmarkResponse))
{
descriptor = Descriptor;
return true;
}
descriptor = null;
return false;
}
///
/// 模拟 generated stream invoker provider 产出的开放静态调用入口。
///
public static object InvokeGeneratedStreamHandler(object handler, object request, CancellationToken cancellationToken)
{
var typedHandler = (IStreamRequestHandler<
StreamInvokerBenchmarks.GeneratedBenchmarkStreamRequest,
StreamInvokerBenchmarks.GeneratedBenchmarkResponse>)handler;
var typedRequest = (StreamInvokerBenchmarks.GeneratedBenchmarkStreamRequest)request;
return typedHandler.Handle(typedRequest, cancellationToken);
}
}