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