using Serein.Library.Api;
namespace Serein.Script
{
public sealed class ScriptInvokeContext : IScriptInvokeContext
{
///
/// 脚本使用流程上下文
///
///
public ScriptInvokeContext(IFlowContext flowContext)
{
FlowContext = flowContext;
}
///
/// 不使用流程上下文
///
public ScriptInvokeContext()
{
}
#pragma warning disable CS8766 // 返回类型中引用类型的为 Null 性与隐式实现的成员不匹配(可能是由于为 Null 性特性)。
public IFlowContext? FlowContext{ get; }
#pragma warning restore CS8766 // 返回类型中引用类型的为 Null 性与隐式实现的成员不匹配(可能是由于为 Null 性特性)。
///
/// 定义的变量
///
private Dictionary _variables = new Dictionary();
///
/// 取消令牌源,用于控制脚本的执行
///
private CancellationTokenSource _tokenSource = new CancellationTokenSource();
///
/// 是否该退出了
///
public bool IsReturn => _tokenSource.IsCancellationRequested;
///
/// 是否严格检查 Null 值 (禁止使用 Null)
///
public bool IsCheckNullValue { get; set; }
///
/// 是否需要提前返回(用于脚本中提前结束)
///
public bool IsNeedReturn { get; set; }
///
/// 获取变量的值
///
///
///
object? IScriptInvokeContext.GetVarValue(string varName)
{
_variables.TryGetValue(varName, out var value);
return value;
}
///
/// 设置变量的值
///
///
///
///
bool IScriptInvokeContext.SetVarValue(string varName, object? value)
{
if (!_variables.TryAdd(varName, value))
{
_variables[varName] = value;
}
return true;
}
void IScriptInvokeContext.OnExit()
{
// 清理脚本中加载的非托管资源
foreach (var nodeObj in _variables.Values)
{
if (nodeObj is not null)
{
if (typeof(IDisposable).IsAssignableFrom(nodeObj?.GetType()) && nodeObj is IDisposable disposable)
{
disposable?.Dispose();
}
}
else
{
}
}
_tokenSource.Cancel();
_variables.Clear();
}
}
}