mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-02 15:50:47 +08:00
准备添加流程接口调用
This commit is contained in:
@@ -10,7 +10,7 @@ namespace Serein.Library.Api
|
||||
/// <summary>
|
||||
/// 流程中的控件
|
||||
/// </summary>
|
||||
public interface IFlowControl
|
||||
public interface IFlowUIControl
|
||||
{
|
||||
/// <summary>
|
||||
/// 节点执行事件
|
||||
@@ -33,7 +33,7 @@ namespace Serein.Library.Api
|
||||
/// 获取窗体控件
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
IFlowControl GetFlowControl();
|
||||
IFlowUIControl GetFlowControl();
|
||||
|
||||
|
||||
}
|
||||
|
||||
68
Library/Api/IFlowControl.cs
Normal file
68
Library/Api/IFlowControl.cs
Normal file
@@ -0,0 +1,68 @@
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serein.Library.Api
|
||||
{
|
||||
/// <summary>
|
||||
/// 流程运行接口
|
||||
/// </summary>
|
||||
public interface IFlowControl
|
||||
{
|
||||
/// <summary>
|
||||
/// <para>需要你提供一个由你实现的ISereinIOC接口实现类</para>
|
||||
/// <para>当你将流程运行环境集成在你的项目时,并希望流程运行时使用你提供的对象,而非自动创建</para>
|
||||
/// <para>就需要你调用这个方法,用来替换运行环境的IOC容器</para>
|
||||
/// <para>注意,是流程运行时,而非运行环境</para>
|
||||
/// </summary>
|
||||
/// <param name="ioc"></param>
|
||||
void UseExternalIOC(ISereinIOC ioc);
|
||||
|
||||
/// <summary>
|
||||
/// 开始运行流程
|
||||
/// </summary>
|
||||
/// <param name="canvasGuids">需要运行的流程Guid</param>
|
||||
/// <returns></returns>
|
||||
Task<bool> StartFlowAsync(string[] canvasGuids);
|
||||
|
||||
/// <summary>
|
||||
/// 从选定的节点开始运行
|
||||
/// </summary>
|
||||
/// <param name="startNodeGuid"></param>
|
||||
/// <returns></returns>
|
||||
Task<bool> StartFlowFromSelectNodeAsync(string startNodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 结束运行
|
||||
/// </summary>
|
||||
Task<bool> ExitFlowAsync();
|
||||
|
||||
/// <summary>
|
||||
/// 激活未启动的全局触发器
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
void ActivateFlipflopNode(string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 终结一个全局触发器,在它触发后将不会再次监听消息(表现为已经启动的触发器至少会再次处理一次消息,后面版本再修正这个非预期行为)
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
void TerminateFlipflopNode(string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 流程启动器调用,监视数据更新通知
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">更新了数据的节点Guid</param>
|
||||
/// <param name="monitorData">更新的数据</param>
|
||||
/// <param name="sourceType">更新的数据</param>
|
||||
void MonitorObjectNotification(string nodeGuid, object monitorData, MonitorObjectEventArgs.ObjSourceType sourceType);
|
||||
|
||||
/// <summary>
|
||||
/// 流程启动器调用,节点触发了中断
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">被中断的节点Guid</param>
|
||||
/// <param name="expression">被触发的表达式</param>
|
||||
/// <param name="type">中断类型。0主动监视,1表达式</param>
|
||||
void TriggerInterrupt(string nodeGuid, string expression, InterruptTriggerEventArgs.InterruptTriggerType type);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
169
Library/Api/IFlowEdit.cs
Normal file
169
Library/Api/IFlowEdit.cs
Normal file
@@ -0,0 +1,169 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Serein.Library.Api
|
||||
{
|
||||
/// <summary>
|
||||
/// 流程编辑
|
||||
/// </summary>
|
||||
public interface IFlowEdit
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// 节点视图模型管理类
|
||||
/// </summary>
|
||||
NodeMVVMService NodeMVVMManagement { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 从节点信息集合批量加载节点控件
|
||||
/// </summary>
|
||||
/// <param name="nodeInfos">节点集合信息</param>
|
||||
/// <returns></returns>
|
||||
Task LoadNodeInfosAsync(List<NodeInfo> nodeInfos);
|
||||
|
||||
#region 流程节点操作接口
|
||||
|
||||
/// <summary>
|
||||
/// 增加画布
|
||||
/// </summary>
|
||||
/// <param name="canvasName">画布名称</param>
|
||||
/// <param name="width">宽度</param>
|
||||
/// <param name="height">高度</param>
|
||||
/// <returns></returns>
|
||||
void CreateCanvas(string canvasName, int width, int height);
|
||||
|
||||
/// <summary>
|
||||
/// 删除画布
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">画布Guid</param>
|
||||
/// <returns></returns>
|
||||
void RemoveCanvas(string canvasGuid);
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 在两个节点之间创建连接关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点Guid</param>
|
||||
/// <param name="toNodeGuid">目标节点Guid</param>
|
||||
/// <param name="fromNodeJunctionType">起始节点控制点</param>
|
||||
/// <param name="toNodeJunctionType">目标节点控制点</param>
|
||||
/// <param name="invokeType">决定了方法执行后的后继行为</param>
|
||||
void ConnectInvokeNode(string canvasGuid,
|
||||
string fromNodeGuid,
|
||||
string toNodeGuid,
|
||||
JunctionType fromNodeJunctionType,
|
||||
JunctionType toNodeJunctionType,
|
||||
ConnectionInvokeType invokeType);
|
||||
|
||||
/// <summary>
|
||||
/// 在两个节点之间创建连接关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点Guid</param>
|
||||
/// <param name="toNodeGuid">目标节点Guid</param>
|
||||
/// <param name="fromNodeJunctionType">起始节点控制点</param>
|
||||
/// <param name="toNodeJunctionType">目标节点控制点</param>
|
||||
/// <param name="argSourceType">决定了方法参数来源</param>
|
||||
/// <param name="argIndex">设置第几个参数</param>
|
||||
void ConnectArgSourceNode(string canvasGuid,
|
||||
string fromNodeGuid,
|
||||
string toNodeGuid,
|
||||
JunctionType fromNodeJunctionType,
|
||||
JunctionType toNodeJunctionType,
|
||||
ConnectionArgSourceType argSourceType,
|
||||
int argIndex);
|
||||
|
||||
/// <summary>
|
||||
/// 移除两个节点之间的方法调用关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点</param>
|
||||
/// <param name="toNodeGuid">目标节点</param>
|
||||
/// <param name="connectionType">连接类型</param>
|
||||
void RemoveInvokeConnect(string canvasGuid, string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType);
|
||||
|
||||
/// <summary>
|
||||
/// 移除连接节点之间参数传递的关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点Guid</param>
|
||||
/// <param name="toNodeGuid">目标节点Guid</param>
|
||||
/// <param name="argIndex">连接到第几个参数</param>
|
||||
void RemoveArgSourceConnect(string canvasGuid, string fromNodeGuid, string toNodeGuid, int argIndex);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 创建节点
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeType">控件类型</param>
|
||||
/// <param name="position">节点在画布上的位置(</param>
|
||||
/// <param name="methodDetailsInfo">节点绑定的方法说明</param>
|
||||
void CreateNode(string canvasGuid, NodeControlType nodeType, PositionOfUI position, MethodDetailsInfo methodDetailsInfo = null);
|
||||
|
||||
/// <summary>
|
||||
/// 移除节点
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">待移除的节点Guid</param>
|
||||
void RemoveNode(string canvasGuid, string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 将节点放置在容器中
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">需要放置的节点Guid</param>
|
||||
/// <param name="containerNodeGuid">存放节点的容器Guid</param>
|
||||
/// <returns></returns>
|
||||
void PlaceNodeToContainer(string canvasGuid, string nodeGuid, string containerNodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 将节点放置在容器中
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">需要取出的节点Guid</param>
|
||||
void TakeOutNodeToContainer(string canvasGuid, string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 设置流程起点节点
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">尝试设置为起始节点的节点Guid</param>
|
||||
/// <returns>被设置为起始节点的Guid</returns>
|
||||
void SetStartNode(string canvasGuid, string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 设置两个节点某个类型的方法调用关系为优先调用
|
||||
/// </summary>
|
||||
/// <param name="fromNodeGuid">起始节点</param>
|
||||
/// <param name="toNodeGuid">目标节点</param>
|
||||
/// <param name="connectionType">连接关系</param>
|
||||
/// <returns></returns>
|
||||
void SetConnectPriorityInvoke(string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 改变可选参数的数目
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">对应的节点Guid</param>
|
||||
/// <param name="isAdd">true,增加参数;false,减少参数</param>
|
||||
/// <param name="paramIndex">以哪个参数为模板进行拷贝,或删去某个参数(该参数必须为可选参数)</param>
|
||||
/// <returns></returns>
|
||||
void ChangeParameter(string nodeGuid, bool isAdd, int paramIndex);
|
||||
|
||||
#endregion
|
||||
|
||||
#region UI视觉
|
||||
|
||||
/// <summary>
|
||||
/// 节点定位
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
void NodeLocate(string nodeGuid);
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
@@ -748,7 +748,7 @@ namespace Serein.Library.Api
|
||||
public void OnEnvOutput(InfoType type, string value);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 运行环境
|
||||
@@ -764,6 +764,15 @@ namespace Serein.Library.Api
|
||||
/// </summary>
|
||||
ISereinIOC IOC { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 流程编辑接口
|
||||
/// </summary>
|
||||
IFlowEdit FlowEdit { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 流程控制接口
|
||||
/// </summary>
|
||||
IFlowControl FlowControl { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 流程事件接口
|
||||
@@ -811,10 +820,6 @@ namespace Serein.Library.Api
|
||||
/// </summary>
|
||||
UIContextOperation UIContextOperation { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 节点视图模型管理类
|
||||
/// </summary>
|
||||
NodeMVVMService NodeMVVMManagement { get; }
|
||||
#endregion
|
||||
|
||||
#region 基本接口
|
||||
@@ -826,6 +831,17 @@ namespace Serein.Library.Api
|
||||
/// <param name="type">输出类型</param>
|
||||
/// <param name="class">输出级别</param>
|
||||
void WriteLine(InfoType type, string message, InfoClass @class = InfoClass.Trivial);
|
||||
/// <summary>
|
||||
/// <para>提供设置UI上下文的能力</para>
|
||||
/// <para>提供设置UI上下文的能力,在WinForm/WPF项目中,在UI线程外对UI元素的修改将会导致异常</para>
|
||||
/// <para>需要你提供</para>
|
||||
/// </summary>
|
||||
/// <param name="uiContextOperation"></param>
|
||||
void SetUIContextOperation(UIContextOperation uiContextOperation);
|
||||
#endregion
|
||||
|
||||
|
||||
#region 项目相关操作
|
||||
|
||||
/// <summary>
|
||||
/// 加载项目文件
|
||||
@@ -845,15 +861,69 @@ namespace Serein.Library.Api
|
||||
/// <returns></returns>
|
||||
Task<SereinProjectData> GetProjectInfoAsync();
|
||||
|
||||
#endregion
|
||||
|
||||
#region 获取节点信息,获取方法信息,获取Emit委托
|
||||
/// <summary>
|
||||
/// 从节点信息集合批量加载节点控件
|
||||
/// 获取节点信息
|
||||
/// </summary>
|
||||
/// <param name="nodeInfos">节点集合信息</param>
|
||||
/// <param name="nodeGuid"></param>
|
||||
/// <param name="nodeModel"></param>
|
||||
/// <returns></returns>
|
||||
Task LoadNodeInfosAsync(List<NodeInfo> nodeInfos);
|
||||
bool TryGetNodeModel(string nodeGuid, out IFlowNode nodeModel);
|
||||
|
||||
/// <summary>
|
||||
/// 获取方法描述信息
|
||||
/// </summary>
|
||||
/// <param name="assemblyName">程序集名称</param>
|
||||
/// <param name="methodName">方法描述</param>
|
||||
/// <param name="mdInfo">方法信息</param>
|
||||
/// <returns></returns>
|
||||
bool TryGetMethodDetailsInfo(string assemblyName, string methodName, out MethodDetailsInfo mdInfo);
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定方法的Emit委托
|
||||
/// </summary>
|
||||
/// <param name="assemblyName">程序集名称</param>
|
||||
/// <param name="methodName"></param>
|
||||
/// <param name="del"></param>
|
||||
/// <returns></returns>
|
||||
bool TryGetDelegateDetails(string assemblyName, string methodName, out DelegateDetails del);
|
||||
#endregion
|
||||
|
||||
|
||||
#region 类库依赖相关
|
||||
|
||||
/// <summary>
|
||||
/// 从文件中加载Dll
|
||||
/// </summary>
|
||||
/// <param name="dllPath"></param>
|
||||
void LoadLibrary(string dllPath);
|
||||
|
||||
/// <summary>
|
||||
/// 移除DLL
|
||||
/// </summary>
|
||||
/// <param name="assemblyFullName">程序集的名称</param>
|
||||
bool TryUnloadLibrary(string assemblyFullName);
|
||||
|
||||
/// <summary>
|
||||
/// 运行时加载
|
||||
/// </summary>
|
||||
/// <param name="file">文件名</param>
|
||||
/// <returns></returns>
|
||||
bool LoadNativeLibraryOfRuning(string file);
|
||||
|
||||
/// <summary>
|
||||
/// 运行时加载指定目录下的类库
|
||||
/// </summary>
|
||||
/// <param name="path">目录</param>
|
||||
/// <param name="isRecurrence">是否递归加载</param>
|
||||
void LoadAllNativeLibraryOfRuning(string path, bool isRecurrence = true);
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
#region 远程相关
|
||||
/// <summary>
|
||||
/// 启动远程服务
|
||||
@@ -895,142 +965,9 @@ namespace Serein.Library.Api
|
||||
|
||||
#endregion
|
||||
|
||||
#region 流程节点操作接口
|
||||
|
||||
/// <summary>
|
||||
/// 增加画布
|
||||
/// </summary>
|
||||
/// <param name="canvasName">画布名称</param>
|
||||
/// <param name="width">宽度</param>
|
||||
/// <param name="height">高度</param>
|
||||
/// <returns></returns>
|
||||
void CreateCanvas(string canvasName, int width , int height);
|
||||
|
||||
/// <summary>
|
||||
/// 删除画布
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">画布Guid</param>
|
||||
/// <returns></returns>
|
||||
void RemoveCanvas(string canvasGuid);
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 在两个节点之间创建连接关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点Guid</param>
|
||||
/// <param name="toNodeGuid">目标节点Guid</param>
|
||||
/// <param name="fromNodeJunctionType">起始节点控制点</param>
|
||||
/// <param name="toNodeJunctionType">目标节点控制点</param>
|
||||
/// <param name="invokeType">决定了方法执行后的后继行为</param>
|
||||
void ConnectInvokeNode(string canvasGuid,
|
||||
string fromNodeGuid,
|
||||
string toNodeGuid,
|
||||
JunctionType fromNodeJunctionType,
|
||||
JunctionType toNodeJunctionType,
|
||||
ConnectionInvokeType invokeType);
|
||||
|
||||
/// <summary>
|
||||
/// 在两个节点之间创建连接关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点Guid</param>
|
||||
/// <param name="toNodeGuid">目标节点Guid</param>
|
||||
/// <param name="fromNodeJunctionType">起始节点控制点</param>
|
||||
/// <param name="toNodeJunctionType">目标节点控制点</param>
|
||||
/// <param name="argSourceType">决定了方法参数来源</param>
|
||||
/// <param name="argIndex">设置第几个参数</param>
|
||||
void ConnectArgSourceNode(string canvasGuid,
|
||||
string fromNodeGuid,
|
||||
string toNodeGuid,
|
||||
JunctionType fromNodeJunctionType,
|
||||
JunctionType toNodeJunctionType,
|
||||
ConnectionArgSourceType argSourceType,
|
||||
int argIndex);
|
||||
|
||||
/// <summary>
|
||||
/// 移除两个节点之间的方法调用关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点</param>
|
||||
/// <param name="toNodeGuid">目标节点</param>
|
||||
/// <param name="connectionType">连接类型</param>
|
||||
void RemoveInvokeConnect(string canvasGuid, string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType);
|
||||
|
||||
/// <summary>
|
||||
/// 移除连接节点之间参数传递的关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点Guid</param>
|
||||
/// <param name="toNodeGuid">目标节点Guid</param>
|
||||
/// <param name="argIndex">连接到第几个参数</param>
|
||||
void RemoveArgSourceConnect(string canvasGuid, string fromNodeGuid, string toNodeGuid, int argIndex);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 创建节点
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeType">控件类型</param>
|
||||
/// <param name="position">节点在画布上的位置(</param>
|
||||
/// <param name="methodDetailsInfo">节点绑定的方法说明</param>
|
||||
void CreateNode(string canvasGuid, NodeControlType nodeType, PositionOfUI position, MethodDetailsInfo methodDetailsInfo = null);
|
||||
|
||||
/// <summary>
|
||||
/// 移除节点
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">待移除的节点Guid</param>
|
||||
void RemoveNode(string canvasGuid, string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 将节点放置在容器中
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">需要放置的节点Guid</param>
|
||||
/// <param name="containerNodeGuid">存放节点的容器Guid</param>
|
||||
/// <returns></returns>
|
||||
void PlaceNodeToContainer(string canvasGuid, string nodeGuid, string containerNodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 将节点放置在容器中
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">需要取出的节点Guid</param>
|
||||
void TakeOutNodeToContainer(string canvasGuid, string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 设置流程起点节点
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">尝试设置为起始节点的节点Guid</param>
|
||||
/// <returns>被设置为起始节点的Guid</returns>
|
||||
void SetStartNode(string canvasGuid, string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 设置两个节点某个类型的方法调用关系为优先调用
|
||||
/// </summary>
|
||||
/// <param name="fromNodeGuid">起始节点</param>
|
||||
/// <param name="toNodeGuid">目标节点</param>
|
||||
/// <param name="connectionType">连接关系</param>
|
||||
/// <returns></returns>
|
||||
void SetConnectPriorityInvoke(string fromNodeGuid, string toNodeGuid, ConnectionInvokeType connectionType);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 改变可选参数的数目
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">对应的节点Guid</param>
|
||||
/// <param name="isAdd">true,增加参数;false,减少参数</param>
|
||||
/// <param name="paramIndex">以哪个参数为模板进行拷贝,或删去某个参数(该参数必须为可选参数)</param>
|
||||
/// <returns></returns>
|
||||
void ChangeParameter(string nodeGuid, bool isAdd, int paramIndex);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 节点中断、表达式
|
||||
#region 节点中断、表达式(暂时没用)
|
||||
#if false
|
||||
|
||||
/// <summary>
|
||||
@@ -1074,137 +1011,8 @@ namespace Serein.Library.Api
|
||||
#endif
|
||||
#endregion
|
||||
|
||||
#region 流程运行相关
|
||||
/// <summary>
|
||||
/// 获取节点信息
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
/// <param name="nodeModel"></param>
|
||||
/// <returns></returns>
|
||||
bool TryGetNodeModel(string nodeGuid, out IFlowNode nodeModel);
|
||||
|
||||
/// <summary>
|
||||
/// 获取方法描述信息
|
||||
/// </summary>
|
||||
/// <param name="assemblyName">程序集名称</param>
|
||||
/// <param name="methodName">方法描述</param>
|
||||
/// <param name="mdInfo">方法信息</param>
|
||||
/// <returns></returns>
|
||||
bool TryGetMethodDetailsInfo(string assemblyName, string methodName, out MethodDetailsInfo mdInfo);
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定方法的Emit委托
|
||||
/// </summary>
|
||||
/// <param name="assemblyName">程序集名称</param>
|
||||
/// <param name="methodName"></param>
|
||||
/// <param name="del"></param>
|
||||
/// <returns></returns>
|
||||
bool TryGetDelegateDetails(string assemblyName, string methodName, out DelegateDetails del);
|
||||
|
||||
/// <summary>
|
||||
/// <para>提供设置UI上下文的能力</para>
|
||||
/// <para>提供设置UI上下文的能力,在WinForm/WPF项目中,在UI线程外对UI元素的修改将会导致异常</para>
|
||||
/// <para>需要你提供</para>
|
||||
/// </summary>
|
||||
/// <param name="uiContextOperation"></param>
|
||||
void SetUIContextOperation(UIContextOperation uiContextOperation);
|
||||
|
||||
/// <summary>
|
||||
/// <para>需要你提供一个由你实现的ISereinIOC接口实现类</para>
|
||||
/// <para>当你将流程运行环境集成在你的项目时,并希望流程运行时使用你提供的对象,而非自动创建</para>
|
||||
/// <para>就需要你调用这个方法,用来替换运行环境的IOC容器</para>
|
||||
/// <para>注意,是流程运行时,而非运行环境</para>
|
||||
/// </summary>
|
||||
/// <param name="ioc"></param>
|
||||
void UseExternalIOC(ISereinIOC ioc);
|
||||
|
||||
/// <summary>
|
||||
/// 开始运行流程
|
||||
/// </summary>
|
||||
/// <param name="canvasGuids">需要运行的流程Guid</param>
|
||||
/// <returns></returns>
|
||||
Task<bool> StartFlowAsync(string[] canvasGuids);
|
||||
|
||||
/// <summary>
|
||||
/// 从选定的节点开始运行
|
||||
/// </summary>
|
||||
/// <param name="startNodeGuid"></param>
|
||||
/// <returns></returns>
|
||||
Task<bool> StartFlowFromSelectNodeAsync(string startNodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 结束运行
|
||||
/// </summary>
|
||||
Task<bool> ExitFlowAsync();
|
||||
|
||||
/// <summary>
|
||||
/// 激活未启动的全局触发器
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
void ActivateFlipflopNode(string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 终结一个全局触发器,在它触发后将不会再次监听消息(表现为已经启动的触发器至少会再次处理一次消息,后面版本再修正这个非预期行为)
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
void TerminateFlipflopNode(string nodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 流程启动器调用,监视数据更新通知
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">更新了数据的节点Guid</param>
|
||||
/// <param name="monitorData">更新的数据</param>
|
||||
/// <param name="sourceType">更新的数据</param>
|
||||
void MonitorObjectNotification(string nodeGuid, object monitorData, MonitorObjectEventArgs.ObjSourceType sourceType);
|
||||
|
||||
/// <summary>
|
||||
/// 流程启动器调用,节点触发了中断
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">被中断的节点Guid</param>
|
||||
/// <param name="expression">被触发的表达式</param>
|
||||
/// <param name="type">中断类型。0主动监视,1表达式</param>
|
||||
void TriggerInterrupt(string nodeGuid, string expression, InterruptTriggerEventArgs.InterruptTriggerType type);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 类库依赖相关
|
||||
|
||||
/// <summary>
|
||||
/// 从文件中加载Dll
|
||||
/// </summary>
|
||||
/// <param name="dllPath"></param>
|
||||
void LoadLibrary(string dllPath);
|
||||
|
||||
/// <summary>
|
||||
/// 移除DLL
|
||||
/// </summary>
|
||||
/// <param name="assemblyFullName">程序集的名称</param>
|
||||
bool TryUnloadLibrary(string assemblyFullName);
|
||||
|
||||
/// <summary>
|
||||
/// 运行时加载
|
||||
/// </summary>
|
||||
/// <param name="file">文件名</param>
|
||||
/// <returns></returns>
|
||||
bool LoadNativeLibraryOfRuning(string file);
|
||||
|
||||
/// <summary>
|
||||
/// 运行时加载指定目录下的类库
|
||||
/// </summary>
|
||||
/// <param name="path">目录</param>
|
||||
/// <param name="isRecurrence">是否递归加载</param>
|
||||
void LoadAllNativeLibraryOfRuning(string path, bool isRecurrence = true);
|
||||
|
||||
#endregion
|
||||
|
||||
#region UI视觉
|
||||
|
||||
/// <summary>
|
||||
/// 节点定位
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
void NodeLocate(string nodeGuid);
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -200,25 +200,24 @@ namespace Serein.Library
|
||||
/// <param name="context"></param>
|
||||
/// <param name="token">流程运行</param>
|
||||
/// <returns></returns>
|
||||
public static async Task StartFlowAsync(this IFlowNode nodeModel, IDynamicContext context, CancellationToken token)
|
||||
public static async Task<FlowResult> StartFlowAsync(this IFlowNode nodeModel, IDynamicContext context, CancellationToken token)
|
||||
{
|
||||
Stack<IFlowNode> stack = new Stack<IFlowNode>();
|
||||
HashSet<IFlowNode> processedNodes = new HashSet<IFlowNode>(); // 用于记录已处理上游节点的节点
|
||||
stack.Push(nodeModel);
|
||||
while (context.RunState != RunState.Completion // 没有完成
|
||||
&& token.IsCancellationRequested == false // 没有取消
|
||||
&& stack.Count > 0) // 循环中直到栈为空才会退出循环
|
||||
|
||||
while (true)
|
||||
{
|
||||
#if DEBUG
|
||||
await Task.Delay(1);
|
||||
#endif
|
||||
if (token.IsCancellationRequested)
|
||||
{
|
||||
throw new Exception($"流程执行被取消,未能获取到流程结果。");
|
||||
}
|
||||
|
||||
#region 执行相关
|
||||
// 从栈中弹出一个节点作为当前节点进行处理
|
||||
var currentNode = stack.Pop();
|
||||
context.NextOrientation = ConnectionInvokeType.None; // 重置上下文状态
|
||||
|
||||
FlowResult flowResult;
|
||||
FlowResult flowResult = null;
|
||||
try
|
||||
{
|
||||
flowResult = await currentNode.ExecutingAsync(context, token);
|
||||
@@ -230,18 +229,15 @@ namespace Serein.Library
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
flowResult = new FlowResult(currentNode,context);
|
||||
flowResult = new FlowResult(currentNode, context);
|
||||
context.Env.WriteLine(InfoType.ERROR, $"节点[{currentNode.Guid}]异常:" + ex);
|
||||
context.NextOrientation = ConnectionInvokeType.IsError;
|
||||
context.ExceptionOfRuning = ex;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region 执行完成
|
||||
//var ignodeState = context.GetIgnodeFlowStateUpload(currentNode);
|
||||
// 更新数据
|
||||
//if(!ignodeState)
|
||||
context.AddOrUpdate(currentNode, flowResult); // 上下文中更新数据
|
||||
#region 执行完成时更新栈
|
||||
context.AddOrUpdate(currentNode, flowResult); // 上下文中更新数据
|
||||
|
||||
// 首先将指定类别后继分支的所有节点逆序推入栈中
|
||||
var nextNodes = currentNode.SuccessorNodes[context.NextOrientation];
|
||||
@@ -255,6 +251,7 @@ namespace Serein.Library
|
||||
stack.Push(nextNodes[index]);
|
||||
}
|
||||
}
|
||||
|
||||
// 然后将指上游分支的所有节点逆序推入栈中
|
||||
var upstreamNodes = currentNode.SuccessorNodes[ConnectionInvokeType.Upstream];
|
||||
for (int index = upstreamNodes.Count - 1; index >= 0; index--)
|
||||
@@ -262,17 +259,40 @@ namespace Serein.Library
|
||||
// 筛选出启用的节点的节点
|
||||
if (upstreamNodes[index].DebugSetting.IsEnable)
|
||||
{
|
||||
//if (!ignodeState)
|
||||
context.SetPreviousNode(upstreamNodes[index], currentNode);
|
||||
context.SetPreviousNode(upstreamNodes[index], currentNode);
|
||||
stack.Push(upstreamNodes[index]);
|
||||
}
|
||||
}
|
||||
//context.RecoverIgnodeFlowStateUpload(currentNode);
|
||||
#endregion
|
||||
|
||||
#region 执行完成后检查
|
||||
|
||||
if (stack.Count == 0)
|
||||
{
|
||||
return flowResult; // 说明流程到了终点
|
||||
}
|
||||
|
||||
if (context.RunState == RunState.Completion)
|
||||
{
|
||||
currentNode.Env.WriteLine(InfoType.INFO, $"流程执行到节点[{currentNode.Guid}]时提前结束,将返回当前执行结果。");
|
||||
return flowResult; // 流程执行完成,返回结果
|
||||
}
|
||||
|
||||
if (token.IsCancellationRequested)
|
||||
{
|
||||
throw new Exception($"流程执行到节点[{currentNode.Guid}]时被取消,未能获取到流程结果。");
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
#if DEBUG
|
||||
await Task.Delay(1);
|
||||
#endif
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取对应的参数数组
|
||||
/// </summary>
|
||||
@@ -478,5 +498,12 @@ namespace Serein.Library
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -32,10 +32,11 @@ namespace Serein.Library
|
||||
/// <param name="context"></param>
|
||||
public FlowResult(IFlowNode nodeModel, IDynamicContext context, object value)
|
||||
{
|
||||
this.NodeGuid = nodeModel.Guid;
|
||||
this.Source = nodeModel;
|
||||
this.ContextGuid = context.Guid;
|
||||
this.Value = value;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 空返回值
|
||||
/// </summary>
|
||||
@@ -43,10 +44,11 @@ namespace Serein.Library
|
||||
/// <param name="context"></param>
|
||||
public FlowResult(IFlowNode nodeModel, IDynamicContext context)
|
||||
{
|
||||
this.NodeGuid = nodeModel.Guid;
|
||||
this.Source = nodeModel;
|
||||
this.ContextGuid = context.Guid;
|
||||
this.Value = Unit.Default;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试获取值
|
||||
/// </summary>
|
||||
@@ -74,7 +76,7 @@ namespace Serein.Library
|
||||
/// <summary>
|
||||
/// 来源节点Guid
|
||||
/// </summary>
|
||||
public string NodeGuid { get; }
|
||||
public IFlowNode Source{ get; }
|
||||
/// <summary>
|
||||
/// 来源上下文Guid
|
||||
/// </summary>
|
||||
@@ -83,6 +85,7 @@ namespace Serein.Library
|
||||
/// 数据值
|
||||
/// </summary>
|
||||
public object Value { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// 生成时间
|
||||
/// </summary>
|
||||
|
||||
Reference in New Issue
Block a user