From 95add80c6d6592a2f5f586d811e24acc8c494ae0 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Wed, 31 Dec 2025 13:30:27 +0800 Subject: [PATCH] =?UTF-8?q?refactor(ioc):=20=E4=BF=AE=E6=94=B9RegisterPlur?= =?UTF-8?q?ality=E6=96=B9=E6=B3=95=E7=9A=84=E5=8F=82=E6=95=B0=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=92=8C=E5=AE=9E=E7=8E=B0=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将RegisterPlurality方法的泛型参数改为object类型 - 移除类型约束检查逻辑 - 简化接口类型获取逻辑 - 添加容器冻结检查注释 - 添加类型重复注册检查注释 - 移除调试日志输出 --- .../ioc/IIocContainer.cs | 8 +++---- GFramework.Core/ioc/IocContainer.cs | 21 ++++++++----------- 2 files changed, 13 insertions(+), 16 deletions(-) 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