using GFramework.Core.Abstractions.ioc; using GFramework.Core.Abstractions.logging; using GFramework.Core.Abstractions.system; 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 _registeredInstances = []; /// /// 日志记录器,用于记录容器操作日志 /// private readonly ILogger _logger = LoggerFactoryResolver.Provider.CreateLogger(nameof(MicrosoftDiContainer)); #endregion #region Register /// /// 注册单例服务实例 /// 确保同一类型只能注册一次,避免重复注册 /// /// 服务类型 /// 要注册的实例对象 /// 当容器已冻结或类型已被注册时抛出 public void RegisterSingleton(T instance) { var type = typeof(T); _lock.EnterWriteLock(); try { ThrowIfFrozen(); // 检查是否已注册该类型,防止重复注册 if (GetServicesUnsafe.Any(s => s.ServiceType == type)) { var errorMsg = $"Singleton already registered for type: {type.Name}"; _logger.Error(errorMsg); throw new InvalidOperationException(errorMsg); } GetServicesUnsafe.AddSingleton(type, instance!); _registeredInstances.Add(instance!); _logger.Debug($"Singleton registered: {type.Name}"); } finally { _lock.ExitWriteLock(); } } /// /// 注册单例服务,指定服务类型和实现类型 /// 直接使用底层DI容器注册类型映射关系 /// /// 服务接口或基类类型 /// 具体的实现类型 public void RegisterSingleton() where TImpl : class, TService where TService : class { _lock.EnterWriteLock(); try { ThrowIfFrozen(); GetServicesUnsafe.AddSingleton(); _logger.Debug($"Singleton registered: {typeof(TService).Name}"); } finally { _lock.ExitWriteLock(); } } /// /// 注册多个实例到其所有接口和具体类型 /// 实现一个实例支持多种接口类型的解析 /// /// 要注册的对象实例 /// 当容器已冻结时抛出 public void RegisterPlurality(object instance) { var concreteType = instance.GetType(); var interfaces = concreteType.GetInterfaces(); _lock.EnterWriteLock(); try { ThrowIfFrozen(); // 注册具体类型映射 GetServicesUnsafe.AddSingleton(concreteType, instance); // 注册所有接口类型映射(指向同一实例) foreach (var interfaceType in interfaces) { GetServicesUnsafe.AddSingleton(interfaceType, _ => instance); } _registeredInstances.Add(instance); _logger.Debug($"Plurality registered: {concreteType.Name} with {interfaces.Length} interfaces"); } finally { _lock.ExitWriteLock(); } } /// /// 注册多个实例到其所有接口 /// 实现一个实例支持多种接口类型的解析 /// public void RegisterPlurality() where T : class { _lock.EnterWriteLock(); try { ThrowIfFrozen(); var concreteType = typeof(T); var interfaces = concreteType.GetInterfaces(); // 注册具体类型 GetServicesUnsafe.AddSingleton(); // 注册所有接口(指向同一个实例) foreach (var interfaceType in interfaces) { GetServicesUnsafe.AddSingleton(interfaceType, sp => sp.GetRequiredService()); } _logger.Debug($"Type registered: {concreteType.Name} with {interfaces.Length} interfaces"); } finally { _lock.ExitWriteLock(); } } /// /// 注册系统实例 /// 通过RegisterPlurality方法注册ISystem类型实例 /// /// 要注册的系统实例 public void RegisterSystem(ISystem system) { RegisterPlurality(system); } /// /// 注册指定泛型类型的服务实例 /// /// 服务类型 /// 要注册的实例对象 /// 当容器已冻结时抛出 public void Register(T instance) { _lock.EnterWriteLock(); try { ThrowIfFrozen(); GetServicesUnsafe.AddSingleton(typeof(T), instance!); _registeredInstances.Add(instance!); _logger.Debug($"Registered: {typeof(T).Name}"); } finally { _lock.ExitWriteLock(); } } /// /// 注册指定类型的服务实例 /// /// 服务类型 /// 要注册的实例对象 /// 当容器已冻结时抛出 public void Register(Type type, object instance) { _lock.EnterWriteLock(); try { ThrowIfFrozen(); GetServicesUnsafe.AddSingleton(type, instance); _registeredInstances.Add(instance); _logger.Debug($"Registered: {type.Name}"); } finally { _lock.ExitWriteLock(); } } /// /// 注册工厂方法来创建服务实例 /// 通过委托函数动态创建服务实例,支持依赖注入 /// /// 服务类型 /// 创建服务实例的工厂委托函数,接收IServiceProvider参数 public void RegisterFactory( Func factory) where TService : class { _lock.EnterWriteLock(); try { ThrowIfFrozen(); GetServicesUnsafe.AddSingleton(factory); } finally { _lock.ExitWriteLock(); } } /// /// 注册中介行为管道 /// 用于配置Mediator框架的行为拦截和处理逻辑 /// /// 行为类型,必须是引用类型 public void RegisterMediatorBehavior() where TBehavior : class { _lock.EnterWriteLock(); try { ThrowIfFrozen(); GetServicesUnsafe.AddSingleton( typeof(IPipelineBehavior<,>), typeof(TBehavior) ); _logger.Debug($"Mediator behavior registered: {typeof(TBehavior).Name}"); } finally { _lock.ExitWriteLock(); } } /// /// 配置服务 /// /// 服务配置委托 public void ExecuteServicesHook(Action? configurator) { _lock.EnterWriteLock(); try { ThrowIfFrozen(); configurator?.Invoke(GetServicesUnsafe); } finally { _lock.ExitWriteLock(); } } #endregion #region Get /// /// 获取指定泛型类型的服务实例 /// 返回第一个匹配的注册实例,如果不存在则返回null /// /// 服务类型 /// 服务实例或null public T? Get() where T : class { if (_provider == null) { // 如果容器未冻结,从服务集合中查找已注册的实例 var serviceType = typeof(T); var descriptor = GetServicesUnsafe.FirstOrDefault(s => s.ServiceType == serviceType || serviceType.IsAssignableFrom(s.ServiceType)); if (descriptor?.ImplementationInstance is T instance) { return instance; } // 在未冻结状态下无法调用工厂方法或创建实例,返回null return null; } _lock.EnterReadLock(); try { var result = _provider!.GetService(); _logger.Debug(result != null ? $"Retrieved instance: {typeof(T).Name}" : $"No instance found for type: {typeof(T).Name}"); return result; } finally { _lock.ExitReadLock(); } } /// /// 获取指定类型的服务实例 /// 返回第一个匹配的注册实例,如果不存在则返回null /// /// 服务类型 /// 服务实例或null public object? Get(Type type) { if (_provider == null) { // 如果容器未冻结,从服务集合中查找已注册的实例 var descriptor = GetServicesUnsafe.FirstOrDefault(s => s.ServiceType == type || type.IsAssignableFrom(s.ServiceType)); return descriptor?.ImplementationInstance; } _lock.EnterReadLock(); try { var result = _provider!.GetService(type); _logger.Debug(result != null ? $"Retrieved instance: {type.Name}" : $"No instance found for type: {type.Name}"); return result; } finally { _lock.ExitReadLock(); } } /// /// 获取指定泛型类型的必需服务实例 /// 必须存在且唯一,否则抛出异常 /// /// 服务类型 /// 唯一的服务实例 /// 当实例不存在或多于一个时抛出 public T GetRequired() where T : class { var list = GetAll(); switch (list.Count) { case 0: var notFoundMsg = $"No instance registered for {typeof(T).Name}"; _logger.Error(notFoundMsg); throw new InvalidOperationException(notFoundMsg); case 1: _logger.Debug($"Retrieved required instance: {typeof(T).Name}"); return list[0]; default: var multipleMsg = $"Multiple instances registered for {typeof(T).Name}"; _logger.Error(multipleMsg); throw new InvalidOperationException(multipleMsg); } } /// /// 获取指定类型的必需服务实例 /// 必须存在且唯一,否则抛出异常 /// /// 服务类型 /// 唯一的服务实例 /// 当实例不存在或多于一个时抛出 public object GetRequired(Type type) { var list = GetAll(type); switch (list.Count) { case 0: var notFoundMsg = $"No instance registered for {type.Name}"; _logger.Error(notFoundMsg); throw new InvalidOperationException(notFoundMsg); case 1: _logger.Debug($"Retrieved required instance: {type.Name}"); return list[0]; default: var multipleMsg = $"Multiple instances registered for {type.Name}"; _logger.Error(multipleMsg); throw new InvalidOperationException(multipleMsg); } } /// /// 获取指定泛型类型的所有服务实例 /// /// 服务类型 /// 只读的服务实例列表 public IReadOnlyList GetAll() where T : class { if (_provider == null) { // 如果容器未冻结,从服务集合中获取已注册的实例 var serviceType = typeof(T); var registeredServices = GetServicesUnsafe .Where(s => s.ServiceType == serviceType || serviceType.IsAssignableFrom(s.ServiceType)).ToList(); var result = new List(); foreach (var descriptor in registeredServices) { if (descriptor.ImplementationInstance is T instance) { result.Add(instance); } else if (descriptor.ImplementationFactory != null) { // 在未冻结状态下无法调用工厂方法,跳过 } else if (descriptor.ImplementationType != null) { // 在未冻结状态下无法创建实例,跳过 } } return result; } _lock.EnterReadLock(); try { var services = _provider!.GetServices().ToList(); _logger.Debug($"Retrieved {services.Count} instances of {typeof(T).Name}"); return services; } finally { _lock.ExitReadLock(); } } /// /// 获取指定类型的所有服务实例 /// /// 服务类型 /// 只读的服务实例列表 /// 当容器未冻结时抛出 public IReadOnlyList GetAll(Type type) { if (_provider == null) { // 如果容器未冻结,从服务集合中获取已注册的实例 var registeredServices = GetServicesUnsafe .Where(s => s.ServiceType == type || type.IsAssignableFrom(s.ServiceType)) .ToList(); var result = new List(); foreach (var descriptor in registeredServices) { if (descriptor.ImplementationInstance != null) { result.Add(descriptor.ImplementationInstance); } else if (descriptor.ImplementationFactory != null) { // 在未冻结状态下无法调用工厂方法,跳过 } else if (descriptor.ImplementationType != null) { // 在未冻结状态下无法创建实例,跳过 } } return result; } _lock.EnterReadLock(); try { var services = _provider!.GetServices(type).ToList(); _logger.Debug($"Retrieved {services.Count} instances of {type.Name}"); return services.Where(o => o != null).Cast().ToList(); } finally { _lock.ExitReadLock(); } } /// /// 获取并排序指定泛型类型的所有服务实例 /// 主要用于系统调度场景 /// /// 服务类型 /// 比较委托,用于定义排序规则 /// 排序后的只读服务实例列表 public IReadOnlyList GetAllSorted(Comparison comparison) where T : class { var list = GetAll().ToList(); list.Sort(comparison); return list; } #endregion #region Utility /// /// 检查容器中是否包含指定泛型类型的实例 /// 根据容器状态选择不同的检查策略 /// /// 要检查的类型 /// true表示包含该类型实例,false表示不包含 public bool Contains() where T : class { if (_provider == null) return GetServicesUnsafe.Any(s => s.ServiceType == typeof(T)); _lock.EnterReadLock(); try { return _provider.GetService() != null; } finally { _lock.ExitReadLock(); } } /// /// 判断容器中是否包含某个具体的实例对象 /// 通过已注册实例集合进行快速查找 /// /// 要检查的实例对象 /// true表示包含该实例,false表示不包含 public bool ContainsInstance(object instance) { _lock.EnterReadLock(); try { return _registeredInstances.Contains(instance); } finally { _lock.ExitReadLock(); } } /// /// 清空容器中的所有实例和服务注册 /// 只有在容器未冻结状态下才能执行清空操作 /// public void Clear() { _lock.EnterWriteLock(); try { // 冻结的容器不允许清空操作 if (_frozen) { _logger.Warn("Cannot clear frozen container"); return; } GetServicesUnsafe.Clear(); _registeredInstances.Clear(); _provider = null; _logger.Info("Container cleared"); } finally { _lock.ExitWriteLock(); } } /// /// 冻结容器并构建ServiceProvider /// 冻结后容器变为只读状态,不能再注册新服务 /// public void Freeze() { _lock.EnterWriteLock(); try { // 防止重复冻结 if (_frozen) { _logger.Warn("Container already frozen"); return; } _provider = GetServicesUnsafe.BuildServiceProvider(); _frozen = true; _logger.Info("IOC Container frozen - ServiceProvider built"); } finally { _lock.ExitWriteLock(); } } /// /// 获取底层的服务集合 /// 提供对内部IServiceCollection的访问权限,用于高级配置和自定义操作 /// /// 底层的IServiceCollection实例 public IServiceCollection GetServicesUnsafe { get; } = serviceCollection ?? new ServiceCollection(); #endregion }