IPluginLoader.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using TeamAAS.FlowEditor.Execution;
  5. using TeamAAS.FlowEditor.Models;
  6. using TeamAAS.FlowEditor.Plugins;
  7. using TeamAAS.FlowEngine.Execution;
  8. namespace TeamAAS.FlowEngine.Interfaces
  9. {
  10. /// <summary>
  11. /// 流程插件加载器接口:负责扫描、注册、实例化流程节点插件(<c>IFlowNodePlugin</c>),
  12. /// 并统一管理当前打开的所有流程 Tab,支撑执行器和组合模块的跨流程查询。
  13. /// </summary>
  14. public interface IPluginLoader
  15. {
  16. /// <summary>
  17. /// 当前插件目录是否已经加载过(防止重复扫描)。
  18. /// </summary>
  19. bool IsLoaded { get; }
  20. /// <summary>
  21. /// 所有已发现的插件描述(只读快照)。
  22. /// </summary>
  23. IReadOnlyList<PluginDescriptor> Descriptors { get; }
  24. /// <summary>
  25. /// 当前打开的所有流程 Tab(编辑器/执行器共用,可绑定到 UI)。
  26. /// </summary>
  27. ObservableCollection<FlowTabItem> FlowTabs { get; set; }
  28. /// <summary>
  29. /// 组合模块编辑时,记录当前子流程对应的组合模块 PluginModel,
  30. /// 公式编辑器据此区分「编辑子流程节点属性」和「编辑组合模块输出」场景。
  31. /// </summary>
  32. FlowGraph SetGroupPluginModel { get; set; }
  33. /// <summary>
  34. /// 组合模块编辑时,记录外层组合模块的 Model,用于 InputSourceDataProvider
  35. /// 查询主流程中组合模块的前置节点结果。
  36. /// </summary>
  37. BasePluginModel ParentGroupModel { get; set; }
  38. /// <summary>
  39. /// 当前在 PropertyGrid 中选中的节点(公式编辑器用它判断上下文)。
  40. /// </summary>
  41. FlowNode SelectFlow { get; set; }
  42. /// <summary>
  43. /// 从指定目录加载所有插件 DLL,并扫描 AppDomain 中已加载的程序集。
  44. /// 清理非插件 DLL/.pdb,避免目录脏乱。只在首次调用时执行。
  45. /// </summary>
  46. /// <param name="pluginsPath">插件目录路径(通常是 EXE 下的 Plugins)</param>
  47. void LoadFrom(string pluginsPath);
  48. /// <summary>
  49. /// 按显示名称创建插件实例(不带模型初始化)。找不到返回 null。
  50. /// </summary>
  51. IFlowNodePlugin CreateInstance(string displayName);
  52. /// <summary>
  53. /// 按显示名称获取插件描述信息(含 PluginType、Attribute 元数据)。找不到返回 null。
  54. /// </summary>
  55. PluginDescriptor GetDescriptor(string displayName);
  56. /// <summary>
  57. /// 获取所有已注册插件的 UI 展示信息(工具箱绑定用)。
  58. /// </summary>
  59. List<NodePluginInfo> GetAllPluginInfos();
  60. /// <summary>
  61. /// 获取单个插件的 UI 展示信息。找不到返回 null。
  62. /// </summary>
  63. NodePluginInfo GetPluginInfo(string displayName);
  64. /// <summary>
  65. /// 通过流程名称获取对应的 FlowTabItem(不存在返回 null)。
  66. /// </summary>
  67. FlowTabItem GetFlowTab(string flowName);
  68. /// <summary>
  69. /// 通过流程名称获取一个新的执行器(基于 FlowGraph 构造 FlowExecutor)。
  70. /// 流程或图不存在返回 null。
  71. /// </summary>
  72. FlowExecutor GetFlowExecutor(string flowName);
  73. /// <summary>
  74. /// 获取所有已打开流程的名称列表(用于下拉框、日志输出等)。
  75. /// </summary>
  76. List<string> GetFlowNames();
  77. /// <summary>
  78. /// 查找指定节点的首个后继节点插件实例(按连线先后顺序,只返回第一个)。
  79. /// 用于条件跳转、组合模块子流程等只取一条后继的场景。
  80. /// </summary>
  81. /// <param name="flowName">流程名称</param>
  82. /// <param name="nodeId">节点 NodeId</param>
  83. IFlowNodePlugin GetPluginTool(string flowName, string nodeId);
  84. /// <summary>
  85. /// 通过 FlowId + NodeId 获取所有后继节点列表。
  86. /// 自动在 FlowTabs 顶层图以及所有组合模块 SubGraph 中递归查找,
  87. /// 找不到目标图时返回空列表。
  88. /// </summary>
  89. /// <param name="flowId">目标图 GraphId(主流程或组合模块子流程皆可)</param>
  90. /// <param name="nodeId">起点节点 NodeId</param>
  91. List<FlowNode> IDGetNextPlugins(string flowId, string nodeId);
  92. }
  93. }