using GFramework.Core.Abstractions.Bases;
using GFramework.Core.Abstractions.Ioc;
using GFramework.Core.Abstractions.Logging;
using GFramework.Core.Abstractions.Systems;
using GFramework.Core.Logging;
using GFramework.Core.Rule;
using Mediator;
using Microsoft.Extensions.DependencyInjection;
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
#region Fields
///
/// 服务提供者,在容器冻结后构建,用于解析服务实例
///
private IServiceProvider? _provider;
///
/// 容器冻结状态标志,true表示容器已冻结不可修改
///
private volatile bool _frozen;
///
/// 读写锁,确保多线程环境下的线程安全操作
///
private readonly ReaderWriterLockSlim _lock = new(LockRecursionPolicy.NoRecursion);
///
/// 已注册实例的集合,用于快速检查实例是否存在
///
private readonly HashSet