// Copyright (c) 2025-2026 GeWuYou
// SPDX-License-Identifier: Apache-2.0
using System.Reflection;
using GFramework.Core.Abstractions.Bases;
using GFramework.Core.Abstractions.Ioc;
using GFramework.Core.Abstractions.Logging;
using GFramework.Core.Abstractions.Systems;
using GFramework.Core.Rule;
using GFramework.Cqrs;
using GFramework.Cqrs.Abstractions.Cqrs;
namespace GFramework.Core.Ioc;
///
/// Microsoft.Extensions.DependencyInjection 适配器
/// 将 Microsoft DI 包装为 IIocContainer 接口实现
/// 提供线程安全的依赖注入容器功能
///
/// 可选的IServiceCollection实例,默认创建新的ServiceCollection
public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null) : ContextAwareBase, IIocContainer
{
#region Helper Methods
///
/// 检查容器是否已冻结,如果已冻结则抛出异常
/// 用于保护注册操作的安全性
///
/// 当容器已冻结时抛出
private void ThrowIfFrozen()
{
if (!_frozen) return;
const string errorMsg = "MicrosoftDiContainer is frozen";
_logger.Error(errorMsg);
throw new InvalidOperationException(errorMsg);
}
#endregion
///
/// 记录某个实例在未冻结查询中可见的服务类型分组信息。
///
/// 当前分组对应的服务类型。
/// 该服务类型下的描述符数量。
/// 该服务类型首次出现的位置,用于稳定打破并列。
private sealed record VisibleServiceTypeGroup(Type ServiceType, int Count, int FirstIndex);
#region Fields
///
/// 服务提供者,在容器冻结后构建,用于解析服务实例
///
private IServiceProvider? _provider;
///
/// 容器冻结状态标志,true表示容器已冻结不可修改
///
private volatile bool _frozen;
///
/// 读写锁,确保多线程环境下的线程安全操作
///
private readonly ReaderWriterLockSlim _lock = new(LockRecursionPolicy.NoRecursion);
///
/// 已注册实例的集合,用于快速检查实例是否存在
///
private readonly HashSet