using Serein.Library.Entity; using Serein.Library.Enums; using Serein.Library.Utils; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Reflection; using System.Threading.Tasks; using static Serein.Library.Utils.ChannelFlowInterrupt; namespace Serein.Library.Api { #region 环境委托 /// /// 流程运行完成 /// /// public delegate void FlowRunCompleteHandler(FlowEventArgs eventArgs); /// /// 项目加载完成 /// public delegate void ProjectLoadedHandler(ProjectLoadedEventArgs eventArgs); /// /// 加载项目文件时成功加载了DLL文件 /// public delegate void LoadDllHandler(LoadDllEventArgs eventArgs); /// /// 移除了加载的dll /// /// public delegate void RemoteDllHandler(RemoteDllEventArgs eventArgs); /// /// 运行环境节点连接发生了改变 /// /// public delegate void NodeConnectChangeHandler(NodeConnectChangeEventArgs eventArgs); /// /// 环境中加载了一个节点 /// /// public delegate void NodeCreateHandler(NodeCreateEventArgs eventArgs); /// /// 环境中流程起始节点发生了改变 /// /// public delegate void StartNodeChangeHandler(StartNodeChangeEventArgs eventArgs); /// /// 被监视的对象改变事件 /// /// public delegate void MonitorObjectChangeHandler(MonitorObjectEventArgs eventArgs); /// /// 节点中断状态改变事件(开启了中断/取消了中断) /// /// public delegate void NodeInterruptStateChangeHandler(NodeInterruptStateChangeEventArgs eventArgs); /// /// 节点触发中断事件 /// /// public delegate void ExpInterruptTriggerHandler(InterruptTriggerEventArgs eventArgs); /// /// IOC容器发生变化 /// public delegate void IOCMembersChangedHandler(IOCMembersChangedEventArgs eventArgs); /// /// 节点需要定位 /// /// public delegate void NodeLocatedHandler(NodeLocatedEventArgs eventArgs); #endregion #region 环境事件签名 /// /// 流程事件签名基类 /// public class FlowEventArgs : EventArgs { /// /// 是否完成 /// public bool IsSucceed { get; protected set; } = true; /// /// 错误提示 /// public string ErrorTips { get; protected set; } = string.Empty; } //public class LoadNodeEventArgs : FlowEventArgs //{ // public LoadNodeEventArgs(NodeInfo NodeInfo, MethodDetails MethodDetailss) // { // this.NodeInfo = NodeInfo; // this.MethodDetailss = MethodDetailss; // } // /// // /// 项目文件节点信息参数 // /// // public NodeInfo NodeInfo { get; protected set; } // /// // /// 已加载在环境中的方法描述 // /// // public MethodDetails MethodDetailss { get; protected set; } //} public class ProjectLoadedEventArgs : FlowEventArgs { public ProjectLoadedEventArgs() { } } public class LoadDllEventArgs : FlowEventArgs { public LoadDllEventArgs(NodeLibrary nodeLibrary, List MethodDetailss) { this.NodeLibrary = nodeLibrary; this.MethodDetailss = MethodDetailss; } /// /// 已加载了的程序集 /// public NodeLibrary NodeLibrary { get; protected set; } /// /// dll文件中有效的流程方法描述 /// public List MethodDetailss { get; protected set; } } public class RemoteDllEventArgs : FlowEventArgs { public RemoteDllEventArgs() { } } public class NodeConnectChangeEventArgs : FlowEventArgs { /// /// 连接关系改变类型 /// public enum ConnectChangeType { /// /// 创建 /// Create, /// /// 移除 /// Remote, } public NodeConnectChangeEventArgs(string fromNodeGuid, string toNodeGuid, ConnectionType connectionType, ConnectChangeType changeType) { this.FromNodeGuid = fromNodeGuid; this.ToNodeGuid = toNodeGuid; this.ConnectionType = connectionType; this.ChangeType = changeType; } /// /// 连接关系中始节点的Guid /// public string FromNodeGuid { get; protected set; } /// /// 连接关系中目标节点的Guid /// public string ToNodeGuid { get; protected set; } /// /// 连接类型 /// public ConnectionType ConnectionType { get; protected set; } /// /// 表示此次需要在两个节点之间创建连接关系,或是移除连接关系 /// public ConnectChangeType ChangeType { get; protected set; } } public class NodeCreateEventArgs : FlowEventArgs { public NodeCreateEventArgs(object nodeModel, Position position) { this.NodeModel = nodeModel; this.Position = position; } public NodeCreateEventArgs(object nodeModel, bool isAddInRegion, string regeionGuid) { this.NodeModel = nodeModel; this.RegeionGuid = regeionGuid; this.IsAddInRegion = isAddInRegion; } /// /// 节点Model对象,目前需要手动转换对应的类型 /// public object NodeModel { get; private set; } public Position Position { get; private set; } public bool IsAddInRegion { get; private set; } public string RegeionGuid { get; private set; } } /// /// 环境中移除了一个节点 /// /// public delegate void NodeRemoteHandler(NodeRemoteEventArgs eventArgs); public class NodeRemoteEventArgs : FlowEventArgs { public NodeRemoteEventArgs(string nodeGuid) { this.NodeGuid = nodeGuid; } /// /// 被移除节点的Guid /// public string NodeGuid { get; private set; } } public class StartNodeChangeEventArgs : FlowEventArgs { public StartNodeChangeEventArgs(string oldNodeGuid, string newNodeGuid) { this.OldNodeGuid = oldNodeGuid; this.NewNodeGuid = newNodeGuid; ; } /// /// 原来的起始节点Guid /// public string OldNodeGuid { get; private set; } /// /// 新的起始节点Guid /// public string NewNodeGuid { get; private set; } } /// /// 监视的节点数据发生变化 /// public class MonitorObjectEventArgs : FlowEventArgs { /// /// 变化的数据类别 /// public enum ObjSourceType { /// /// 流程节点的数据 /// NodeFlowData, /// /// IOC容器对象 /// IOCObj, } /// /// 在某个节点运行时,监听的数据发生了改变 /// /// /// /// public MonitorObjectEventArgs(string nodeGuid, object monitorData, ObjSourceType objSourceType) { NodeGuid = nodeGuid; NewData = monitorData; ObjSource = objSourceType; } /// /// 中断的节点Guid /// public string NodeGuid { get; protected set; } /// /// 监听对象类别 /// public ObjSourceType ObjSource { get; protected set; } /// /// 新的数据 /// public object NewData { get; protected set; } } /// /// 节点中断状态改变事件参数 /// public class NodeInterruptStateChangeEventArgs : FlowEventArgs { public NodeInterruptStateChangeEventArgs(string nodeGuid, InterruptClass @class) { NodeGuid = nodeGuid; Class = @class; } /// /// 中断的节点Guid /// public string NodeGuid { get; protected set; } public InterruptClass Class { get; protected set; } } /// /// 节点触发了中断事件参数 /// public class InterruptTriggerEventArgs : FlowEventArgs { public enum InterruptTriggerType { /// /// 主动监视中断 /// Monitor, /// /// 表达式中断 /// Exp, /// /// 对象监视中断 /// Obj, } public InterruptTriggerEventArgs(string nodeGuid, string expression, InterruptTriggerType type) { this.NodeGuid = nodeGuid; this.Expression = expression; this.Type = type; } /// /// 中断的节点Guid /// public string NodeGuid { get; protected set; } public string Expression { get; protected set; } public InterruptTriggerType Type { get; protected set; } } /// /// 流程事件签名基类 /// public class IOCMembersChangedEventArgs : FlowEventArgs { public enum EventType { /// /// 登记了类型 /// Registered, /// /// 构建了类型 /// Completeuild, } public IOCMembersChangedEventArgs(string key, object instance) { this.Key = key; this.Instance = instance; } public string Key { get; private set; } public object Instance { get; private set; } } public class NodeLocatedEventArgs : FlowEventArgs { public NodeLocatedEventArgs(string nodeGuid) { NodeGuid = nodeGuid; } public string NodeGuid { get; private set; } } #endregion /// /// 运行环境 /// public interface IFlowEnvironment { #region 属性 /// /// 单例模式IOC容器,内部维护了一个实例字典,默认使用类型的FullName作为Key,如果以“接口-实现类”的方式注册,那么将使用接口类型的FullName作为Key。 /// 当某个类型注册绑定成功后,将不会因为其它地方尝试注册相同类型的行为导致类型被重新创建。 /// ISereinIOC IOC { get; } /// /// 环境名称 /// string EnvName { get; } /// /// 是否全局中断 /// bool IsGlobalInterrupt { get; } /// /// DLL中NodeAction特性的方法描述的所有原始副本 /// // ConcurrentDictionary MethodDetailss { get; } /// /// 流程运行状态 /// RunState FlowState { get; set; } /// /// 全局触发器运行状态 /// RunState FlipFlopState { get; set; } #endregion #region 事件 /// /// 加载Dll /// event LoadDllHandler OnDllLoad; /// /// 项目加载完成 /// event ProjectLoadedHandler OnProjectLoaded; /// /// 节点连接属性改变事件 /// event NodeConnectChangeHandler OnNodeConnectChange; /// /// 节点创建事件 /// event NodeCreateHandler OnNodeCreate; /// /// 移除节点事件 /// event NodeRemoteHandler OnNodeRemote; /// /// 起始节点变化事件 /// event StartNodeChangeHandler OnStartNodeChange; /// /// 流程运行完成事件 /// event FlowRunCompleteHandler OnFlowRunComplete; /// /// 被监视的对象改变事件 /// event MonitorObjectChangeHandler OnMonitorObjectChange; /// /// 节点中断状态变化事件 /// event NodeInterruptStateChangeHandler OnNodeInterruptStateChange; /// /// 触发中断 /// event ExpInterruptTriggerHandler OnInterruptTrigger; /// /// IOC容器发生改变 /// event IOCMembersChangedHandler OnIOCMembersChanged; /// /// 节点需要定位 /// event NodeLocatedHandler OnNodeLocate; #endregion /// /// 获取方法描述信息 /// /// 方法描述 /// 方法信息 /// bool TryGetMethodDetailsInfo(string methodName, out MethodDetailsInfo mdInfo); /// /// 获取指定方法的Emit委托 /// /// /// /// bool TryGetDelegateDetails(string methodName, out DelegateDetails del); //bool TryGetNodeData(string methodName, out NodeData node); #region 环境基础接口 /// /// 保存当前项目 /// /// SereinProjectData GetProjectInfo(); /// /// 加载项目文件 /// /// /// void LoadProject(SereinProjectData projectFile, string filePath); /// /// 加载远程项目 /// /// 远程项目地址 /// 远程项目端口 /// 密码 void LoadRemoteProject(string addres,int port, string token); /// /// 从文件中加载Dll /// /// void LoadDll(string dllPath); /// /// 移除DLL /// /// 程序集的名称 bool RemoteDll(string assemblyFullName); /// /// 清理加载的DLL(待更改) /// void ClearAll(); /// /// 开始运行 /// Task StartAsync(); /// /// 从选定的节点开始运行 /// /// /// Task StartFlowInSelectNodeAsync(string startNodeGuid); /// /// 结束运行 /// void Exit(); /// /// 设置流程起点节点 /// /// void SetStartNode(string nodeGuid); /// /// 在两个节点之间创建连接关系 /// /// 起始节点Guid /// 目标节点Guid /// 连接类型 void ConnectNode(string fromNodeGuid, string toNodeGuid, ConnectionType connectionType); /// /// 创建节点/区域/基础控件 /// /// 节点/区域/基础控件 /// 节点在画布上的位置( /// 节点绑定的方法说明( void CreateNode(NodeControlType nodeBase, Position position, MethodDetailsInfo methodDetailsInfo = null); /// /// 移除两个节点之间的连接关系 /// /// 起始节点 /// 目标节点 /// 连接类型 void RemoveConnect(string fromNodeGuid, string toNodeGuid, ConnectionType connectionType); /// /// 移除节点/区域/基础控件 /// /// 待移除的节点Guid void RemoveNode(string nodeGuid); /// /// 激活未启动的全局触发器 /// /// void ActivateFlipflopNode(string nodeGuid); /// /// 终结一个全局触发器,在它触发后将不会再次监听消息(表现为已经启动的触发器至少会再次处理一次消息,后面版本再修正这个非预期行为) /// /// void TerminateFlipflopNode(string nodeGuid); /// /// 设置节点中断级别 /// /// 被中断的节点Guid /// 新的中断级别 /// bool SetNodeInterrupt(string nodeGuid, InterruptClass interruptClass); /// /// 添加作用于某个对象的中断表达式 /// /// /// /// bool AddInterruptExpression(string key, string expression); /// /// 监视指定对象 /// /// 需要监视的对象 /// 是否启用监视 void SetMonitorObjState(string key,bool isMonitor); /// /// 检查一个对象是否处于监听状态,如果是,则传出与该对象相关的表达式(用于中断),如果不是,则返回false。 /// /// 判断的对象 /// 表达式 /// bool CheckObjMonitorState(string key, out List exps); /// /// 全局中断 /// /// /// /// Task GetOrCreateGlobalInterruptAsync(); #region 远程相关 /// /// (适用于远程连接后获取环境的运行状态)获取当前环境的信息 /// /// object GetEnvInfo(); #endregion #endregion #region 启动器调用 /// /// 流程启动器调用,监视数据更新通知 /// /// 更新了数据的节点Guid /// 更新的数据 /// 更新的数据 void MonitorObjectNotification(string nodeGuid, object monitorData, MonitorObjectEventArgs.ObjSourceType sourceType); /// /// 流程启动器调用,节点触发了中断 /// /// 被中断的节点Guid /// 被触发的表达式 /// 中断类型。0主动监视,1表达式 void TriggerInterrupt(string nodeGuid, string expression, InterruptTriggerEventArgs.InterruptTriggerType type); #endregion #region UI视觉 /// /// 节点定位 /// /// void NodeLocated(string nodeGuid); #endregion } }