mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-04-05 15:56:33 +08:00
重新设计接口类,将流程运行环境和IOC解耦
This commit is contained in:
@@ -739,6 +739,7 @@ namespace Serein.Library.Api
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 运行环境
|
||||
/// </summary>
|
||||
@@ -758,7 +759,6 @@ namespace Serein.Library.Api
|
||||
/// </summary>
|
||||
string EnvName { get; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 项目文件位置
|
||||
/// </summary>
|
||||
@@ -785,11 +785,6 @@ namespace Serein.Library.Api
|
||||
/// </summary>
|
||||
RunState FlowState { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 全局触发器运行状态
|
||||
/// </summary>
|
||||
//RunState FlipFlopState { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 表示当前环境
|
||||
/// </summary>
|
||||
@@ -811,8 +806,9 @@ namespace Serein.Library.Api
|
||||
/// <summary>
|
||||
/// 输出信息
|
||||
/// </summary>
|
||||
/// <param name="message"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <param name="message">消息</param>
|
||||
/// <param name="type">输出类型</param>
|
||||
/// <param name="class">输出级别</param>
|
||||
void WriteLine(InfoType type, string message, InfoClass @class = InfoClass.Trivial);
|
||||
|
||||
/// <summary>
|
||||
@@ -840,7 +836,6 @@ namespace Serein.Library.Api
|
||||
/// <returns></returns>
|
||||
Task LoadNodeInfosAsync(List<NodeInfo> nodeInfos);
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region 远程相关
|
||||
@@ -906,6 +901,7 @@ namespace Serein.Library.Api
|
||||
/// <summary>
|
||||
/// 移动了某个节点(远程插件使用)
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid"></param>
|
||||
/// <param name="x"></param>
|
||||
/// <param name="y"></param>
|
||||
@@ -914,6 +910,7 @@ namespace Serein.Library.Api
|
||||
/// <summary>
|
||||
/// 设置流程起点节点
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">尝试设置为起始节点的节点Guid</param>
|
||||
/// <returns>被设置为起始节点的Guid</returns>
|
||||
Task<string> SetStartNodeAsync(string canvasGuid, string nodeGuid);
|
||||
@@ -921,6 +918,7 @@ namespace Serein.Library.Api
|
||||
/// <summary>
|
||||
/// 在两个节点之间创建连接关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点Guid</param>
|
||||
/// <param name="toNodeGuid">目标节点Guid</param>
|
||||
/// <param name="fromNodeJunctionType">起始节点控制点</param>
|
||||
@@ -936,6 +934,7 @@ namespace Serein.Library.Api
|
||||
/// <summary>
|
||||
/// 在两个节点之间创建连接关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点Guid</param>
|
||||
/// <param name="toNodeGuid">目标节点Guid</param>
|
||||
/// <param name="fromNodeJunctionType">起始节点控制点</param>
|
||||
@@ -950,26 +949,32 @@ namespace Serein.Library.Api
|
||||
ConnectionArgSourceType argSourceType,
|
||||
int argIndex);
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 创建节点
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeType">控件类型</param>
|
||||
/// <param name="position">节点在画布上的位置(</param>
|
||||
/// <param name="methodDetailsInfo">节点绑定的方法说明</param>
|
||||
Task<NodeInfo> CreateNodeAsync(string canvasGuid, NodeControlType nodeType, PositionOfUI position, MethodDetailsInfo methodDetailsInfo = null);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 将节点放置在容器中
|
||||
/// 将节点放置在容器中
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">需要放置的节点Guid</param>
|
||||
/// <param name="containerNodeGuid">存放节点的容器Guid</param>
|
||||
/// <returns></returns>
|
||||
Task<bool> PlaceNodeToContainerAsync(string canvasGuid, string nodeGuid, string containerNodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 将节点从容器中脱离
|
||||
/// 将节点放置在容器中
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">需要取出的节点Guid</param>
|
||||
Task<bool> TakeOutNodeToContainerAsync(string canvasGuid, string nodeGuid);
|
||||
|
||||
|
||||
@@ -984,7 +989,8 @@ namespace Serein.Library.Api
|
||||
|
||||
/// <summary>
|
||||
/// 移除两个节点之间的方法调用关系
|
||||
/// </summary>
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点</param>
|
||||
/// <param name="toNodeGuid">目标节点</param>
|
||||
/// <param name="connectionType">连接类型</param>
|
||||
@@ -993,15 +999,16 @@ namespace Serein.Library.Api
|
||||
/// <summary>
|
||||
/// 移除连接节点之间参数传递的关系
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="fromNodeGuid">起始节点Guid</param>
|
||||
/// <param name="toNodeGuid">目标节点Guid</param>
|
||||
/// <param name="argIndex">连接到第几个参数</param>
|
||||
/// <param name="connectionArgSourceType">参数来源类型</param>
|
||||
Task<bool> RemoveConnectArgSourceAsync(string canvasGuid, string fromNodeGuid, string toNodeGuid, int argIndex);
|
||||
|
||||
/// <summary>
|
||||
/// 移除节点/区域/基础控件
|
||||
/// </summary>
|
||||
/// <param name="canvasGuid">所在画布</param>
|
||||
/// <param name="nodeGuid">待移除的节点Guid</param>
|
||||
Task<bool> RemoveNodeAsync(string canvasGuid, string nodeGuid);
|
||||
|
||||
@@ -1089,11 +1096,21 @@ namespace Serein.Library.Api
|
||||
bool TryGetDelegateDetails(string assemblyName, string methodName, out DelegateDetails del);
|
||||
|
||||
/// <summary>
|
||||
/// 提供设置UI上下文的能力
|
||||
/// <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>
|
||||
/// </summary>
|
||||
/// <param name="ioc"></param>
|
||||
void UseExternalIOC(ISereinIOC ioc);
|
||||
|
||||
/// <summary>
|
||||
/// 开始运行流程
|
||||
/// </summary>
|
||||
@@ -1101,7 +1118,6 @@ namespace Serein.Library.Api
|
||||
/// <returns></returns>
|
||||
Task<bool> StartFlowAsync(string[] canvasGuids);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 从选定的节点开始运行
|
||||
/// </summary>
|
||||
@@ -1142,14 +1158,6 @@ namespace Serein.Library.Api
|
||||
/// <param name="type">中断类型。0主动监视,1表达式</param>
|
||||
void TriggerInterrupt(string nodeGuid, string expression, InterruptTriggerEventArgs.InterruptTriggerType type);
|
||||
|
||||
/// <summary>
|
||||
/// 立刻调用某个节点,并获取其返回值
|
||||
/// </summary>
|
||||
/// <param name="context">调用时的上下文</param>
|
||||
/// <param name="nodeGuid">节点Guid</param>
|
||||
/// <returns></returns>
|
||||
// Task<object> InvokeNodeAsync(IDynamicContext context, string nodeGuid);
|
||||
|
||||
#endregion
|
||||
|
||||
#region 类库依赖相关
|
||||
|
||||
@@ -32,6 +32,13 @@ namespace Serein.Library.Api
|
||||
/// <returns></returns>
|
||||
ISereinIOC Register(Type type, Func<object> getInstance);
|
||||
|
||||
/// <summary>
|
||||
/// 通过泛型的方式注册实例
|
||||
/// </summary>
|
||||
/// <typeparam name="T">实例类型</typeparam>
|
||||
/// <returns></returns>
|
||||
ISereinIOC Register<T>();
|
||||
|
||||
/// <summary>
|
||||
/// 通过泛型的方式注册实例
|
||||
/// </summary>
|
||||
@@ -84,6 +91,19 @@ namespace Serein.Library.Api
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
ISereinIOC Build();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 从容器中获取某个类型的实例进行运行
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="action"></param>
|
||||
/// <returns></returns>
|
||||
ISereinIOC Run<T>(Action<T> action);
|
||||
ISereinIOC Run<T1, T2>(Action<T1, T2> action);
|
||||
ISereinIOC Run<T1, T2, T3>(Action<T1, T2, T3> action);
|
||||
ISereinIOC Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,9 +25,39 @@ namespace Serein.Library
|
||||
var emitMethodType = EmitHelper.CreateDynamicMethod(methodInfo, out var emitDelegate);
|
||||
_emitMethodInfo = emitMethodType;
|
||||
_emitDelegate = emitDelegate;
|
||||
|
||||
SetFunc();
|
||||
}
|
||||
|
||||
|
||||
private void SetFunc()
|
||||
{
|
||||
if (_emitDelegate is Func<object, object[], Task<object>> hasResultTask)
|
||||
{
|
||||
this.hasResultTask = hasResultTask;
|
||||
funcType = 2;
|
||||
}
|
||||
else if (_emitDelegate is Func<object, object[], Task> task)
|
||||
{
|
||||
this.task = task;
|
||||
funcType = 1;
|
||||
}
|
||||
else if (_emitDelegate is Func<object, object[], object> func)
|
||||
{
|
||||
this.func = func;
|
||||
funcType = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotSupportedException();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public Func<object, object[], Task<object>> hasResultTask;
|
||||
public Func<object, object[], Task> task;
|
||||
public Func<object, object[], object> func;
|
||||
|
||||
|
||||
/*/// <summary>
|
||||
/// 更新委托方法
|
||||
@@ -42,6 +72,12 @@ namespace Serein.Library
|
||||
|
||||
private Delegate _emitDelegate;
|
||||
private EmitMethodInfo _emitMethodInfo;
|
||||
/// <summary>
|
||||
/// 0是普通
|
||||
/// 1是异步无返回值
|
||||
/// 2是异步有返回值
|
||||
/// </summary>
|
||||
private int funcType;
|
||||
|
||||
/// <summary>
|
||||
/// 该Emit委托的相应信息
|
||||
@@ -92,34 +128,25 @@ namespace Serein.Library
|
||||
instance = null;
|
||||
}
|
||||
object result = null;
|
||||
if (_emitDelegate is Func<object, object[], Task<object>> hasResultTask)
|
||||
{
|
||||
result = await hasResultTask(instance, args);
|
||||
}
|
||||
else if (_emitDelegate is Func<object, object[], Task> task)
|
||||
{
|
||||
await task.Invoke(instance, args);
|
||||
}
|
||||
else if (_emitDelegate is Func<object, object[], object> func)
|
||||
if(funcType == 0)
|
||||
{
|
||||
result = func.Invoke(instance, args);
|
||||
|
||||
}
|
||||
else if (funcType == 2)
|
||||
{
|
||||
result = await hasResultTask(instance, args);
|
||||
}
|
||||
else if (funcType == 1)
|
||||
{
|
||||
await task(instance, args);
|
||||
result = null;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new NotImplementedException("创建了非预期委托(应该不会出现)");
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
|
||||
//try
|
||||
//{
|
||||
|
||||
//}
|
||||
//catch
|
||||
//{
|
||||
// throw;
|
||||
//}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace Serein.Library.Utils
|
||||
{
|
||||
|
||||
/// <summary>
|
||||
/// IOC管理容器
|
||||
/// 一个轻量级的IOC容器
|
||||
/// </summary>
|
||||
public class SereinIOC : ISereinIOC
|
||||
{
|
||||
@@ -79,6 +79,20 @@ namespace Serein.Library.Utils
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 向容器注册类型,并指定其实例成员
|
||||
/// </summary>
|
||||
/// <typeparam name="T">需要注册的类型</typeparam>
|
||||
/// <param name="getInstance">获取实例的回调函数</param>
|
||||
/// <returns></returns>
|
||||
public ISereinIOC Register<T>()
|
||||
{
|
||||
var type = typeof(T);
|
||||
RegisterType(type.FullName, type);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 向容器注册类型,并指定其实例成员
|
||||
/// </summary>
|
||||
@@ -485,7 +499,7 @@ namespace Serein.Library.Utils
|
||||
continue;
|
||||
}
|
||||
_dependencies[typeName] = value;
|
||||
OnIOCMembersChanged.Invoke(new IOCMembersChangedEventArgs(typeName, value));
|
||||
OnIOCMembersChanged?.Invoke(new IOCMembersChangedEventArgs(typeName, value));
|
||||
}
|
||||
_typeMappings.Clear();
|
||||
return this;
|
||||
@@ -577,85 +591,45 @@ namespace Serein.Library.Utils
|
||||
return isPass;
|
||||
}
|
||||
|
||||
|
||||
private void Run<T>(Action<T> action)
|
||||
#endregion
|
||||
|
||||
#region 运行
|
||||
|
||||
public ISereinIOC Run<T>(Action<T> action)
|
||||
{
|
||||
var service = Get<T>();
|
||||
action(service);
|
||||
return this;
|
||||
}
|
||||
|
||||
private void Run<T1, T2>(Action<T1, T2> action)
|
||||
public ISereinIOC Run<T1, T2>(Action<T1, T2> action)
|
||||
{
|
||||
var service1 = Get<T1>();
|
||||
var service2 = Get<T2>();
|
||||
|
||||
action(service1, service2);
|
||||
action(service1, service2);
|
||||
return this;
|
||||
}
|
||||
|
||||
private void Run<T1, T2, T3>(Action<T1, T2, T3> action)
|
||||
public ISereinIOC Run<T1, T2, T3>(Action<T1, T2, T3> action)
|
||||
{
|
||||
var service1 = Get<T1>();
|
||||
var service2 = Get<T2>();
|
||||
var service3 = Get<T3>();
|
||||
action(service1, service2, service3);
|
||||
return this;
|
||||
}
|
||||
|
||||
private void Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action)
|
||||
public ISereinIOC Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action)
|
||||
{
|
||||
var service1 = Get<T1>();
|
||||
var service2 = Get<T2>();
|
||||
var service3 = Get<T3>();
|
||||
var service4 = Get<T4>();
|
||||
action(service1, service2, service3, service4);
|
||||
return this;
|
||||
}
|
||||
|
||||
private void Run<T1, T2, T3, T4, T5>(Action<T1, T2, T3, T4, T5> action)
|
||||
{
|
||||
var service1 = Get<T1>();
|
||||
var service2 = Get<T2>();
|
||||
var service3 = Get<T3>();
|
||||
var service4 = Get<T4>();
|
||||
var service5 = Get<T5>();
|
||||
action(service1, service2, service3, service4, service5);
|
||||
}
|
||||
|
||||
private void Run<T1, T2, T3, T4, T5, T6>(Action<T1, T2, T3, T4, T5, T6> action)
|
||||
{
|
||||
var service1 = Get<T1>();
|
||||
var service2 = Get<T2>();
|
||||
var service3 = Get<T3>();
|
||||
var service4 = Get<T4>();
|
||||
var service5 = Get<T5>();
|
||||
var service6 = Get<T6>();
|
||||
action(service1, service2, service3, service4, service5, service6);
|
||||
}
|
||||
|
||||
private void Run<T1, T2, T3, T4, T5, T6, T7>(Action<T1, T2, T3, T4, T5, T6, T7> action)
|
||||
{
|
||||
var service1 = Get<T1>();
|
||||
var service2 = Get<T2>();
|
||||
var service3 = Get<T3>();
|
||||
var service4 = Get<T4>();
|
||||
var service5 = Get<T5>();
|
||||
var service6 = Get<T6>();
|
||||
var service7 = Get<T7>();
|
||||
action(service1, service2, service3, service4, service5, service6, service7);
|
||||
}
|
||||
|
||||
private void Run<T1, T2, T3, T4, T5, T6, T7, T8>(Action<T1, T2, T3, T4, T5, T6, T7, T8> action)
|
||||
{
|
||||
var service1 = Get<T1>();
|
||||
var service2 = Get<T2>();
|
||||
var service3 = Get<T3>();
|
||||
var service4 = Get<T4>();
|
||||
var service5 = Get<T5>();
|
||||
var service6 = Get<T6>();
|
||||
var service7 = Get<T7>();
|
||||
var service8 = Get<T8>();
|
||||
action(service1, service2, service3, service4, service5, service6, service7, service8);
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
|
||||
@@ -45,9 +45,9 @@ namespace Serein.Library.Utils
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 传入UI线程上下文
|
||||
/// 传入获取UI线程上下文的闭包创建
|
||||
/// </summary>
|
||||
/// <param name="synchronizationContext">线程上下文</param>
|
||||
/// <param name="getUiContext">获取线程上下文的闭包函数</param>
|
||||
public UIContextOperation(Func<SynchronizationContext> getUiContext)
|
||||
{
|
||||
this.getUiContext = getUiContext;
|
||||
|
||||
Reference in New Issue
Block a user