// Copyright (c) 2025-2026 GeWuYou
// SPDX-License-Identifier: Apache-2.0
using System;
using System.Collections.Generic;
using System.Linq;
using GFramework.Core.Abstractions.Bases;
using GFramework.Core.Abstractions.Ioc;
using GFramework.Core.Abstractions.Rule;
using GFramework.Core.Abstractions.Systems;
using GFramework.Core.Ioc;
using Microsoft.Extensions.DependencyInjection;
namespace GFramework.Cqrs.Benchmarks.Messaging;
///
/// 把冻结后的 benchmark 根容器与单个 组合成 request 级解析视图。
///
///
/// `CqrsDispatcher` 会直接依赖 做 handler / pipeline 解析,
/// 因此 request lifetime benchmark 需要一个既保留根容器注册元数据,又把实例解析切换到显式作用域 provider
/// 的最小适配层。该类型只覆盖 benchmark 当前 request 路径会使用到的解析相关入口;
/// 任何注册、清空或冻结修改操作都应继续发生在根容器构建阶段,因此这里统一拒绝可变更 API。
///
internal sealed class ScopedBenchmarkContainer : IIocContainer
{
private readonly MicrosoftDiContainer _rootContainer;
private readonly IServiceProvider _scopedProvider;
///
/// 初始化一个绑定到单个 request 作用域的 benchmark 容器适配器。
///
/// 已冻结的 benchmark 根容器。
/// 当前 request 独占的作用域实例。
internal ScopedBenchmarkContainer(MicrosoftDiContainer rootContainer, IServiceScope scope)
{
_rootContainer = rootContainer ?? throw new ArgumentNullException(nameof(rootContainer));
ArgumentNullException.ThrowIfNull(scope);
_scopedProvider = scope.ServiceProvider;
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterSingleton(T instance)
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterSingleton()
where TImpl : class, TService
where TService : class
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterTransient()
where TImpl : class, TService
where TService : class
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterScoped()
where TImpl : class, TService
where TService : class
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterPlurality(object instance)
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterPlurality() where T : class
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterSystem(ISystem system)
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void Register(T instance)
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void Register(Type type, object instance)
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterFactory(Func factory) where TService : class
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterCqrsPipelineBehavior() where TBehavior : class
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterCqrsStreamPipelineBehavior() where TBehavior : class
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterCqrsHandlersFromAssembly(System.Reflection.Assembly assembly)
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持在 request 作用域内追加注册。
///
public void RegisterCqrsHandlersFromAssemblies(IEnumerable assemblies)
{
throw CreateMutationNotSupportedException();
}
///
/// 当前适配器不支持执行额外的服务配置钩子。
///
public void ExecuteServicesHook(Action? configurator = null)
{
throw CreateMutationNotSupportedException();
}
///
/// 从当前 request 作用域解析单个服务实例。
///
public T? Get() where T : class
{
return _scopedProvider.GetService();
}
///
/// 从当前 request 作用域解析单个服务实例。
///
public object? Get(Type type)
{
ArgumentNullException.ThrowIfNull(type);
return _scopedProvider.GetService(type);
}
///
/// 从当前 request 作用域解析必需的单个服务实例。
///
public T GetRequired() where T : class
{
return _scopedProvider.GetRequiredService();
}
///
/// 从当前 request 作用域解析必需的单个服务实例。
///
public object GetRequired(Type type)
{
ArgumentNullException.ThrowIfNull(type);
return _scopedProvider.GetRequiredService(type);
}
///
/// 从当前 request 作用域解析全部服务实例。
///
public IReadOnlyList GetAll() where T : class
{
return _scopedProvider.GetServices().ToList();
}
///
/// 从当前 request 作用域解析全部服务实例。
///
public IReadOnlyList