using Serein.Library.Api; namespace Serein.Script { public sealed class ScriptInvokeContext : IScriptInvokeContext { /// /// 不使用流程上下文 /// public ScriptInvokeContext() { } /// /// 定义的变量 /// 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(); } } }