refactor(ioc): 将Services属性重命名为GetServicesUnsafe以提高安全性

- 将MicrosoftDiContainer中的Services属性重命名为GetServicesUnsafe
- 将IIocContainer接口中的Services属性重命名为GetServicesUnsafe
- 更新所有使用Services的地方为GetServicesUnsafe
- 保持原有的功能不变,仅修改属性名称以避免直接访问风险
This commit is contained in:
GeWuYou 2026-02-14 19:29:26 +08:00 committed by gewuyou
parent a420a41a55
commit c16f89cb47
2 changed files with 22 additions and 21 deletions

View File

@ -181,7 +181,7 @@ public interface IIocContainer : IContextAware
/// 提供对内部IServiceCollection的访问权限用于高级配置和自定义操作 /// 提供对内部IServiceCollection的访问权限用于高级配置和自定义操作
/// </summary> /// </summary>
/// <returns>底层的IServiceCollection实例</returns> /// <returns>底层的IServiceCollection实例</returns>
IServiceCollection Services { get; } IServiceCollection GetServicesUnsafe { get; }
#endregion #endregion
} }

View File

@ -80,14 +80,14 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
ThrowIfFrozen(); ThrowIfFrozen();
// 检查是否已注册该类型,防止重复注册 // 检查是否已注册该类型,防止重复注册
if (Services.Any(s => s.ServiceType == type)) if (GetServicesUnsafe.Any(s => s.ServiceType == type))
{ {
var errorMsg = $"Singleton already registered for type: {type.Name}"; var errorMsg = $"Singleton already registered for type: {type.Name}";
_logger.Error(errorMsg); _logger.Error(errorMsg);
throw new InvalidOperationException(errorMsg); throw new InvalidOperationException(errorMsg);
} }
Services.AddSingleton(type, instance!); GetServicesUnsafe.AddSingleton(type, instance!);
_registeredInstances.Add(instance!); _registeredInstances.Add(instance!);
_logger.Debug($"Singleton registered: {type.Name}"); _logger.Debug($"Singleton registered: {type.Name}");
} }
@ -111,7 +111,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
try try
{ {
ThrowIfFrozen(); ThrowIfFrozen();
Services.AddSingleton<TService, TImpl>(); GetServicesUnsafe.AddSingleton<TService, TImpl>();
_logger.Debug($"Singleton registered: {typeof(TService).Name}"); _logger.Debug($"Singleton registered: {typeof(TService).Name}");
} }
finally finally
@ -138,12 +138,12 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
ThrowIfFrozen(); ThrowIfFrozen();
// 注册具体类型映射 // 注册具体类型映射
Services.AddSingleton(concreteType, instance); GetServicesUnsafe.AddSingleton(concreteType, instance);
// 注册所有接口类型映射(指向同一实例) // 注册所有接口类型映射(指向同一实例)
foreach (var interfaceType in interfaces) foreach (var interfaceType in interfaces)
{ {
Services.AddSingleton(interfaceType, _ => instance); GetServicesUnsafe.AddSingleton(interfaceType, _ => instance);
} }
_registeredInstances.Add(instance); _registeredInstances.Add(instance);
@ -170,12 +170,12 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
var interfaces = concreteType.GetInterfaces(); var interfaces = concreteType.GetInterfaces();
// 注册具体类型 // 注册具体类型
Services.AddSingleton<T>(); GetServicesUnsafe.AddSingleton<T>();
// 注册所有接口(指向同一个实例) // 注册所有接口(指向同一个实例)
foreach (var interfaceType in interfaces) foreach (var interfaceType in interfaces)
{ {
Services.AddSingleton(interfaceType, sp => sp.GetRequiredService<T>()); GetServicesUnsafe.AddSingleton(interfaceType, sp => sp.GetRequiredService<T>());
} }
_logger.Debug($"Type registered: {concreteType.Name} with {interfaces.Length} interfaces"); _logger.Debug($"Type registered: {concreteType.Name} with {interfaces.Length} interfaces");
@ -208,7 +208,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
try try
{ {
ThrowIfFrozen(); ThrowIfFrozen();
Services.AddSingleton(typeof(T), instance!); GetServicesUnsafe.AddSingleton(typeof(T), instance!);
_registeredInstances.Add(instance!); _registeredInstances.Add(instance!);
_logger.Debug($"Registered: {typeof(T).Name}"); _logger.Debug($"Registered: {typeof(T).Name}");
} }
@ -230,7 +230,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
try try
{ {
ThrowIfFrozen(); ThrowIfFrozen();
Services.AddSingleton(type, instance); GetServicesUnsafe.AddSingleton(type, instance);
_registeredInstances.Add(instance); _registeredInstances.Add(instance);
_logger.Debug($"Registered: {type.Name}"); _logger.Debug($"Registered: {type.Name}");
} }
@ -253,7 +253,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
try try
{ {
ThrowIfFrozen(); ThrowIfFrozen();
Services.AddSingleton(factory); GetServicesUnsafe.AddSingleton(factory);
} }
finally finally
{ {
@ -274,7 +274,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
{ {
ThrowIfFrozen(); ThrowIfFrozen();
Services.AddSingleton( GetServicesUnsafe.AddSingleton(
typeof(IPipelineBehavior<,>), typeof(IPipelineBehavior<,>),
typeof(TBehavior) typeof(TBehavior)
); );
@ -297,7 +297,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
try try
{ {
ThrowIfFrozen(); ThrowIfFrozen();
configurator?.Invoke(Services); configurator?.Invoke(GetServicesUnsafe);
} }
finally finally
{ {
@ -321,7 +321,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
{ {
// 如果容器未冻结,从服务集合中查找已注册的实例 // 如果容器未冻结,从服务集合中查找已注册的实例
var serviceType = typeof(T); var serviceType = typeof(T);
var descriptor = Services.FirstOrDefault(s => var descriptor = GetServicesUnsafe.FirstOrDefault(s =>
s.ServiceType == serviceType || serviceType.IsAssignableFrom(s.ServiceType)); s.ServiceType == serviceType || serviceType.IsAssignableFrom(s.ServiceType));
if (descriptor?.ImplementationInstance is T instance) if (descriptor?.ImplementationInstance is T instance)
@ -360,7 +360,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
{ {
// 如果容器未冻结,从服务集合中查找已注册的实例 // 如果容器未冻结,从服务集合中查找已注册的实例
var descriptor = var descriptor =
Services.FirstOrDefault(s => s.ServiceType == type || type.IsAssignableFrom(s.ServiceType)); GetServicesUnsafe.FirstOrDefault(s => s.ServiceType == type || type.IsAssignableFrom(s.ServiceType));
return descriptor?.ImplementationInstance; return descriptor?.ImplementationInstance;
} }
@ -449,7 +449,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
{ {
// 如果容器未冻结,从服务集合中获取已注册的实例 // 如果容器未冻结,从服务集合中获取已注册的实例
var serviceType = typeof(T); var serviceType = typeof(T);
var registeredServices = Services var registeredServices = GetServicesUnsafe
.Where(s => s.ServiceType == serviceType || serviceType.IsAssignableFrom(s.ServiceType)).ToList(); .Where(s => s.ServiceType == serviceType || serviceType.IsAssignableFrom(s.ServiceType)).ToList();
var result = new List<T>(); var result = new List<T>();
@ -496,7 +496,8 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
if (_provider == null) if (_provider == null)
{ {
// 如果容器未冻结,从服务集合中获取已注册的实例 // 如果容器未冻结,从服务集合中获取已注册的实例
var registeredServices = Services.Where(s => s.ServiceType == type || type.IsAssignableFrom(s.ServiceType)) var registeredServices = GetServicesUnsafe
.Where(s => s.ServiceType == type || type.IsAssignableFrom(s.ServiceType))
.ToList(); .ToList();
var result = new List<object>(); var result = new List<object>();
@ -559,7 +560,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
public bool Contains<T>() where T : class public bool Contains<T>() where T : class
{ {
if (_provider == null) if (_provider == null)
return Services.Any(s => s.ServiceType == typeof(T)); return GetServicesUnsafe.Any(s => s.ServiceType == typeof(T));
_lock.EnterReadLock(); _lock.EnterReadLock();
try try
@ -607,7 +608,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
return; return;
} }
Services.Clear(); GetServicesUnsafe.Clear();
_registeredInstances.Clear(); _registeredInstances.Clear();
_provider = null; _provider = null;
_logger.Info("Container cleared"); _logger.Info("Container cleared");
@ -634,7 +635,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
return; return;
} }
_provider = Services.BuildServiceProvider(); _provider = GetServicesUnsafe.BuildServiceProvider();
_frozen = true; _frozen = true;
_logger.Info("IOC Container frozen - ServiceProvider built"); _logger.Info("IOC Container frozen - ServiceProvider built");
} }
@ -649,7 +650,7 @@ public class MicrosoftDiContainer(IServiceCollection? serviceCollection = null)
/// 提供对内部IServiceCollection的访问权限用于高级配置和自定义操作 /// 提供对内部IServiceCollection的访问权限用于高级配置和自定义操作
/// </summary> /// </summary>
/// <returns>底层的IServiceCollection实例</returns> /// <returns>底层的IServiceCollection实例</returns>
public IServiceCollection Services { get; } = serviceCollection ?? new ServiceCollection(); public IServiceCollection GetServicesUnsafe { get; } = serviceCollection ?? new ServiceCollection();
#endregion #endregion
} }