using System.Collections.ObjectModel;
using GFramework.Core.Abstractions.bases;
namespace GFramework.Core.Abstractions.registries;
///
/// 基于Dictionary的通用键值注册表基类
/// 提供基于字典的键值对注册、查询和管理功能
///
/// 键的类型
/// 值的类型
public abstract class KeyValueRegistryBase
: IRegistry
{
///
/// 存储键值对映射关系的字典
///
protected readonly IDictionary Map;
///
/// 初始化KeyValueRegistryBase的新实例
///
/// 用于比较键的相等性的比较器,如果为null则使用默认比较器
protected KeyValueRegistryBase(IEqualityComparer? comparer = null)
{
// 使用指定的比较器或默认比较器创建字典
Map = new Dictionary(comparer ?? EqualityComparer.Default);
}
///
/// 根据指定的键获取对应的值
///
/// 要查找的键
/// 与键关联的值
/// 当键不存在时抛出异常
public virtual TValue Get(TKey key)
{
return Map.TryGetValue(key, out var value)
? value
: throw new KeyNotFoundException($"{GetType().Name}: key not registered: {key}");
}
///
/// 判断是否包含指定的键
///
/// 要检查的键
/// 如果包含该键返回true,否则返回false
public virtual bool Contains(TKey key)
{
return Map.ContainsKey(key);
}
///
/// 注册键值对到注册表中
///
/// 要注册的键
/// 要注册的值
/// 当前注册表实例,支持链式调用
public virtual IRegistry Registry(TKey key, TValue value)
{
Map.Add(key, value);
return this;
}
///
/// 注册键值对映射对象到注册表中
///
/// 包含键值对的映射对象
/// 当前注册表实例,支持链式调用
public virtual IRegistry Registry(IKeyValue mapping)
{
return Registry(mapping.Key, mapping.Value);
}
///
/// 从注册表中移除指定键的项
///
/// 要移除的键
/// 如果成功移除则返回true,否则返回false
public bool Unregister(TKey key)
{
return Map.Remove(key);
}
///
/// 获取注册表中所有的键值对
///
/// 包含所有注册键值对的只读字典
public IReadOnlyDictionary GetAll()
{
return Map as IReadOnlyDictionary ?? new ReadOnlyDictionary(Map);
}
///
/// 获取注册表中所有的值
///
/// 包含所有注册值的只读集合
public IReadOnlyCollection Values()
{
return Map.Values as IReadOnlyCollection ?? new ReadOnlyCollection(Map.Values.ToList());
}
///
/// 获取注册表中所有的键
///
public IEnumerable Keys => Map.Keys;
///
/// 获取注册表中项的数量
///
public int Count => Map.Count;
}