mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-04-28 18:43:23 +08:00
1. 解决了DynamicFlow标记在静态类上导致流程初始化异常的问题,现在可以使用DynamicFlow修饰静态类了
This commit is contained in:
@@ -146,28 +146,28 @@ namespace Serein.NodeFlow.Env
|
|||||||
|
|
||||||
// 初始化每个画布的数据,转换为流程任务
|
// 初始化每个画布的数据,转换为流程任务
|
||||||
var flowTasks = guids.Select(guid =>
|
var flowTasks = guids.Select(guid =>
|
||||||
{
|
|
||||||
if (!flowModelService.TryGetCanvasModel(guid, out var canvasModel))
|
|
||||||
{
|
{
|
||||||
SereinEnv.WriteLine(InfoType.WARN, $"画布不存在,将不会运行。{guid}");
|
if (!flowModelService.TryGetCanvasModel(guid, out var canvasModel))
|
||||||
return default;
|
{
|
||||||
}
|
SereinEnv.WriteLine(InfoType.WARN, $"画布不存在,将不会运行。{guid}");
|
||||||
if (canvasModel.StartNode is null)
|
return default;
|
||||||
{
|
}
|
||||||
SereinEnv.WriteLine(InfoType.WARN, $"画布不存在起始节点,将不会运行。{guid}");
|
if (canvasModel.StartNode is null)
|
||||||
return default;
|
{
|
||||||
}
|
SereinEnv.WriteLine(InfoType.WARN, $"画布不存在起始节点,将不会运行。{guid}");
|
||||||
return canvasModel;
|
return default;
|
||||||
})
|
}
|
||||||
|
return canvasModel;
|
||||||
|
})
|
||||||
.Where(canvasModel => canvasModel != default && canvasModel.StartNode != null)
|
.Where(canvasModel => canvasModel != default && canvasModel.StartNode != null)
|
||||||
.OfType<FlowCanvasDetails>()
|
.OfType<FlowCanvasDetails>()
|
||||||
.ToDictionary(key => key.Guid,
|
.ToDictionary(key => key.Guid,
|
||||||
value => new FlowTask
|
value => new FlowTask
|
||||||
{
|
{
|
||||||
GetStartNode = () => value.StartNode!,
|
GetStartNode = () => value.StartNode!,
|
||||||
GetNodes = () => flowModelService.GetAllNodeModel(value.Guid),
|
GetNodes = () => flowModelService.GetAllNodeModel(value.Guid),
|
||||||
IsWaitStartFlow = false
|
IsWaitStartFlow = false
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
if(flowTasks.Values.Count == 0)
|
if(flowTasks.Values.Count == 0)
|
||||||
@@ -181,7 +181,7 @@ namespace Serein.NodeFlow.Env
|
|||||||
IOC.Register<IFlowEnvironment>(() => flowEnvironment);
|
IOC.Register<IFlowEnvironment>(() => flowEnvironment);
|
||||||
var flowWorkManagement = GetFWM();
|
var flowWorkManagement = GetFWM();
|
||||||
flowWorkManagement.WorkOptions.Flows = flowTasks;
|
flowWorkManagement.WorkOptions.Flows = flowTasks;
|
||||||
flowWorkManagement.WorkOptions.AutoRegisterTypes = flowLibraryService.GetaAutoRegisterType(); // 需要自动实例化的类型
|
//flowWorkManagement.WorkOptions.AutoRegisterTypes = flowLibraryService.GetaAutoRegisterType(); // 需要自动实例化的类型
|
||||||
flowWorkManagement.WorkOptions.InitMds = flowLibraryService.GetMdsOnFlowStart(NodeType.Init);
|
flowWorkManagement.WorkOptions.InitMds = flowLibraryService.GetMdsOnFlowStart(NodeType.Init);
|
||||||
flowWorkManagement.WorkOptions.LoadMds = flowLibraryService.GetMdsOnFlowStart(NodeType.Loading);
|
flowWorkManagement.WorkOptions.LoadMds = flowLibraryService.GetMdsOnFlowStart(NodeType.Loading);
|
||||||
flowWorkManagement.WorkOptions.ExitMds = flowLibraryService.GetMdsOnFlowStart(NodeType.Exit);
|
flowWorkManagement.WorkOptions.ExitMds = flowLibraryService.GetMdsOnFlowStart(NodeType.Exit);
|
||||||
@@ -351,8 +351,6 @@ namespace Serein.NodeFlow.Env
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/// <inheritdoc/>
|
/// <inheritdoc/>
|
||||||
public void ActivateFlipflopNode(string nodeGuid)
|
public void ActivateFlipflopNode(string nodeGuid)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -54,11 +54,6 @@ namespace Serein.NodeFlow
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
public Dictionary<string, FlowTask> Flows { get; set; } = [];
|
public Dictionary<string, FlowTask> Flows { get; set; } = [];
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// 需要注册的类型
|
|
||||||
/// </summary>
|
|
||||||
public Dictionary<RegisterSequence, List<Type>> AutoRegisterTypes { get; set; } = [];
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 初始化时需要的方法
|
/// 初始化时需要的方法
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ using System.Collections.Concurrent;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Net.Http.Headers;
|
||||||
using System.Threading.Tasks.Dataflow;
|
using System.Threading.Tasks.Dataflow;
|
||||||
using System.Xml.Linq;
|
using System.Xml.Linq;
|
||||||
|
|
||||||
@@ -54,6 +55,7 @@ namespace Serein.NodeFlow.Services
|
|||||||
var sw = Stopwatch.StartNew();
|
var sw = Stopwatch.StartNew();
|
||||||
var checkpoints = new Dictionary<string, TimeSpan>();
|
var checkpoints = new Dictionary<string, TimeSpan>();
|
||||||
|
|
||||||
|
|
||||||
#region 注册所有节点所属的类的类型,如果注册失败则退出
|
#region 注册所有节点所属的类的类型,如果注册失败则退出
|
||||||
List<IFlowNode> nodes = new List<IFlowNode>();
|
List<IFlowNode> nodes = new List<IFlowNode>();
|
||||||
var flowTask = WorkOptions.Flows.Values.ToArray();
|
var flowTask = WorkOptions.Flows.Values.ToArray();
|
||||||
@@ -130,27 +132,37 @@ namespace Serein.NodeFlow.Services
|
|||||||
var env = WorkOptions.Environment;
|
var env = WorkOptions.Environment;
|
||||||
var ioc = WorkOptions.FlowIOC;
|
var ioc = WorkOptions.FlowIOC;
|
||||||
|
|
||||||
|
HashSet<Type> types = new HashSet<Type>();
|
||||||
|
|
||||||
var nodeMds = nodes.Select(item => item.MethodDetails).ToList(); // 获取环境中所有节点的方法信息
|
var nodeMds = nodes.Select(item => item.MethodDetails).ToList(); // 获取环境中所有节点的方法信息
|
||||||
var allMds = new List<MethodDetails>();
|
var allMds = new List<MethodDetails>();
|
||||||
allMds.AddRange(nodeMds.Where(md => md?.ActingInstanceType is not null));
|
IEnumerable<MethodDetails> Where(IEnumerable<MethodDetails> mds)
|
||||||
allMds.AddRange(WorkOptions.InitMds.Where(md => md?.ActingInstanceType is not null));
|
{
|
||||||
allMds.AddRange(WorkOptions.LoadMds.Where(md => md?.ActingInstanceType is not null));
|
return mds.Where(md => md?.ActingInstanceType is not null && !md.ActingInstanceType.IsSealed && !md.ActingInstanceType.IsAbstract);
|
||||||
allMds.AddRange(WorkOptions.ExitMds.Where(md => md?.ActingInstanceType is not null));
|
}
|
||||||
|
allMds.AddRange(Where(nodeMds));
|
||||||
|
allMds.AddRange(Where(WorkOptions.InitMds));
|
||||||
|
allMds.AddRange(Where(WorkOptions.ExitMds));
|
||||||
|
allMds.AddRange(Where(WorkOptions.LoadMds));
|
||||||
var isSuccessful = true;
|
var isSuccessful = true;
|
||||||
foreach (var md in allMds)
|
foreach (var md in allMds)
|
||||||
{
|
{
|
||||||
if (md.ActingInstanceType != null)
|
|
||||||
|
Type? type = md.ActingInstanceType;
|
||||||
|
if (type is null)
|
||||||
|
{
|
||||||
|
SereinEnv.WriteLine(InfoType.ERROR, "{md.MethodName} - 没有类型声明");
|
||||||
|
isSuccessful = false;
|
||||||
|
}
|
||||||
|
else if (types.Add(type))
|
||||||
{
|
{
|
||||||
ioc.Register(md.ActingInstanceType);
|
ioc.Register(md.ActingInstanceType);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
SereinEnv.WriteLine(InfoType.ERROR, "{md.MethodName} - 没有类型声明");
|
|
||||||
isSuccessful = false ;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if(types.Count == 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
ioc.Build(); // 绑定初始化时注册的类型
|
ioc.Build(); // 绑定初始化时注册的类型
|
||||||
foreach (var md in allMds)
|
foreach (var md in allMds)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user