diff --git a/GFramework.Core.Abstractions/ioc/IIocContainer.cs b/GFramework.Core.Abstractions/ioc/IIocContainer.cs
index 1994820..834303e 100644
--- a/GFramework.Core.Abstractions/ioc/IIocContainer.cs
+++ b/GFramework.Core.Abstractions/ioc/IIocContainer.cs
@@ -23,11 +23,11 @@ public interface IIocContainer : IContextAware
///
- /// 注册一个实例及其所有可赋值的接口类型到容器中
+ /// 注册多个实例
+ /// 将实例注册到其实现的所有接口和具体类型上
///
- /// 实例的类型
- /// 要注册的实例对象,不能为null
- void RegisterPlurality(T instance);
+ /// 要注册的实例
+ public void RegisterPlurality(object instance);
///
/// 注册系统实例,将其绑定到其所有实现的接口上
diff --git a/GFramework.Core/ioc/IocContainer.cs b/GFramework.Core/ioc/IocContainer.cs
index 6d48fcc..6501b5f 100644
--- a/GFramework.Core/ioc/IocContainer.cs
+++ b/GFramework.Core/ioc/IocContainer.cs
@@ -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
}
}
-
///
- /// 注册一个实例及其所有可赋值的接口类型到容器中
+ /// 注册多个实例
+ /// 将实例注册到其实现的所有接口和具体类型上
///
- /// 实例的类型
- /// 要注册的实例对象,不能为null
- public void RegisterPlurality(T instance)
+ /// 要注册的实例
+ 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