mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-03-22 10:34:30 +08:00
refactor(ioc): 修改RegisterPlurality方法的参数类型和实现逻辑
- 将RegisterPlurality方法的泛型参数改为object类型 - 移除类型约束检查逻辑 - 简化接口类型获取逻辑 - 添加容器冻结检查注释 - 添加类型重复注册检查注释 - 移除调试日志输出
This commit is contained in:
parent
2cfa78b91d
commit
95add80c6d
@ -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>
|
||||
/// 注册系统实例,将其绑定到其所有实现的接口上
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user