using GFramework.Core.Abstractions.environment;
using GFramework.Core.rule;
namespace GFramework.Core.environment;
///
/// 环境基础抽象类,实现了IEnvironment接口,提供环境值的存储和获取功能
///
public abstract class EnvironmentBase : ContextAwareBase, IEnvironment
{
///
/// 存储环境值的字典,键为字符串,值为对象类型
///
protected readonly Dictionary Values = new();
///
/// 获取环境名称的抽象属性
///
public abstract string Name { get; }
///
/// 根据键获取指定类型的值
///
/// 要获取的值的类型,必须为引用类型
/// 用于查找值的键
/// 如果找到则返回对应类型的值,否则返回null
public virtual T? Get(string key) where T : class
{
return TryGet(key, out var value) ? value : null;
}
///
/// 尝试根据键获取指定类型的值
///
/// 要获取的值的类型,必须为引用类型
/// 用于查找值的键
/// 输出参数,如果成功则包含找到的值,否则为null
/// 如果找到指定键且类型匹配则返回true,否则返回false
public virtual bool TryGet(string key, out T value) where T : class
{
if (Values.TryGetValue(key, out var obj) && obj is T typed)
{
value = typed;
return true;
}
value = null!;
return false;
}
///
/// 根据键获取必需的指定类型值,如果找不到则抛出异常
///
/// 要获取的值的类型,必须为引用类型
/// 用于查找值的键
/// 找到的对应类型的值
/// 当指定键的值不存在时抛出
public virtual T GetRequired(string key) where T : class
{
if (TryGet(key, out var value))
return value;
throw new InvalidOperationException(
$"Environment [{Name}] missing required value: key='{key}', type='{typeof(T).Name}'");
}
void IEnvironment.Register(string key, object value)
{
Register(key, value);
}
public abstract void Initialize();
///
/// 注册键值对到环境值字典中
///
/// 要注册的键
/// 要注册的值
protected void Register(string key, object value)
{
Values[key] = value;
}
}