refactor(ioc): 修改RegisterPlurality方法的参数类型和实现逻辑

- 将RegisterPlurality方法的泛型参数改为object类型
- 移除类型约束检查逻辑
- 简化接口类型获取逻辑
- 添加容器冻结检查注释
- 添加类型重复注册检查注释
- 移除调试日志输出
This commit is contained in:
GeWuYou 2025-12-31 13:30:27 +08:00
parent 2cfa78b91d
commit 95add80c6d
2 changed files with 13 additions and 16 deletions

View File

@ -23,11 +23,11 @@ public interface IIocContainer : IContextAware
/// <summary>
/// 注册一个实例及其所有可赋值的接口类型到容器中
/// 注册多个实例
/// 将实例注册到其实现的所有接口和具体类型上
/// </summary>
/// <typeparam name="T">实例的类型</typeparam>
/// <param name="instance">要注册的实例对象不能为null</param>
void RegisterPlurality<T>(T instance);
/// <param name="instance">要注册的实例</param>
public void RegisterPlurality(object instance);
/// <summary>
/// 注册系统实例,将其绑定到其所有实现的接口上

View File

@ -70,6 +70,7 @@ public class IocContainer : ContextAwareBase, IIocContainer
_lock.EnterWriteLock();
try
{
// 检查容器是否已被冻结
if (_frozen)
{
var errorMsg = "IocContainer is frozen";
@ -77,6 +78,7 @@ public class IocContainer : ContextAwareBase, IIocContainer
throw new InvalidOperationException(errorMsg);
}
// 检查该类型是否已经注册过单例
if (_typeIndex.TryGetValue(type, out var set) && set.Count > 0)
{
var errorMsg = $"Singleton already registered for type: {type.Name}";
@ -93,31 +95,26 @@ public class IocContainer : ContextAwareBase, IIocContainer
}
}
/// <summary>
/// 注册一个实例及其所有可赋值的接口类型到容器中
/// 注册多个实例
/// 将实例注册到其实现的所有接口和具体类型上
/// </summary>
/// <typeparam name="T">实例的类型</typeparam>
/// <param name="instance">要注册的实例对象不能为null</param>
public void RegisterPlurality<T>(T instance)
/// <param name="instance">要注册的实例</param>
public void RegisterPlurality(object instance)
{
var concreteType = instance!.GetType();
// 获取实例类型直接实现的所有接口并筛选出可以赋值给T类型的接口
var interfaces = concreteType.GetInterfaces()
.Where(typeof(T).IsAssignableFrom);
var concreteType = instance.GetType();
var interfaces = concreteType.GetInterfaces();
_lock.EnterWriteLock();
try
{
// 注册具体类型
RegisterInternal(concreteType, instance);
_logger.Debug($"Registered concrete type: {concreteType.Name}");
// 注册所有匹配的接口类型
// 注册所有接口类型
foreach (var itf in interfaces)
{
RegisterInternal(itf, instance);
_logger.Debug($"Registered interface: {itf.Name} for {concreteType.Name}");
}
}
finally