using System; using System.Collections.Generic; using System.Collections.ObjectModel; using TeamAAS.FlowEditor.Execution; using TeamAAS.FlowEditor.Models; using TeamAAS.FlowEditor.Plugins; using TeamAAS.FlowEngine.Execution; namespace TeamAAS.FlowEngine.Interfaces { /// /// 流程插件加载器接口:负责扫描、注册、实例化流程节点插件(IFlowNodePlugin), /// 并统一管理当前打开的所有流程 Tab,支撑执行器和组合模块的跨流程查询。 /// public interface IPluginLoader { /// /// 当前插件目录是否已经加载过(防止重复扫描)。 /// bool IsLoaded { get; } /// /// 所有已发现的插件描述(只读快照)。 /// IReadOnlyList Descriptors { get; } /// /// 当前打开的所有流程 Tab(编辑器/执行器共用,可绑定到 UI)。 /// ObservableCollection FlowTabs { get; set; } /// /// 组合模块编辑时,记录当前子流程对应的组合模块 PluginModel, /// 公式编辑器据此区分「编辑子流程节点属性」和「编辑组合模块输出」场景。 /// FlowGraph SetGroupPluginModel { get; set; } /// /// 组合模块编辑时,记录外层组合模块的 Model,用于 InputSourceDataProvider /// 查询主流程中组合模块的前置节点结果。 /// BasePluginModel ParentGroupModel { get; set; } /// /// 当前在 PropertyGrid 中选中的节点(公式编辑器用它判断上下文)。 /// FlowNode SelectFlow { get; set; } /// /// 从指定目录加载所有插件 DLL,并扫描 AppDomain 中已加载的程序集。 /// 清理非插件 DLL/.pdb,避免目录脏乱。只在首次调用时执行。 /// /// 插件目录路径(通常是 EXE 下的 Plugins) void LoadFrom(string pluginsPath); /// /// 按显示名称创建插件实例(不带模型初始化)。找不到返回 null。 /// IFlowNodePlugin CreateInstance(string displayName); /// /// 按显示名称获取插件描述信息(含 PluginType、Attribute 元数据)。找不到返回 null。 /// PluginDescriptor GetDescriptor(string displayName); /// /// 获取所有已注册插件的 UI 展示信息(工具箱绑定用)。 /// List GetAllPluginInfos(); /// /// 获取单个插件的 UI 展示信息。找不到返回 null。 /// NodePluginInfo GetPluginInfo(string displayName); /// /// 通过流程名称获取对应的 FlowTabItem(不存在返回 null)。 /// FlowTabItem GetFlowTab(string flowName); /// /// 通过流程名称获取一个新的执行器(基于 FlowGraph 构造 FlowExecutor)。 /// 流程或图不存在返回 null。 /// FlowExecutor GetFlowExecutor(string flowName); /// /// 获取所有已打开流程的名称列表(用于下拉框、日志输出等)。 /// List GetFlowNames(); /// /// 查找指定节点的首个后继节点插件实例(按连线先后顺序,只返回第一个)。 /// 用于条件跳转、组合模块子流程等只取一条后继的场景。 /// /// 流程名称 /// 节点 NodeId IFlowNodePlugin GetPluginTool(string flowName, string nodeId); /// /// 通过 FlowId + NodeId 获取所有后继节点列表。 /// 自动在 FlowTabs 顶层图以及所有组合模块 SubGraph 中递归查找, /// 找不到目标图时返回空列表。 /// /// 目标图 GraphId(主流程或组合模块子流程皆可) /// 起点节点 NodeId List IDGetNextPlugins(string flowId, string nodeId); } }