1. 解决了DynamicFlow标记在静态类上导致流程初始化异常的问题,现在可以使用DynamicFlow修饰静态类了

This commit is contained in:
fengjiayi
2025-08-05 11:15:42 +08:00
parent 3059e109fc
commit 0029bc885e
3 changed files with 42 additions and 37 deletions

View File

@@ -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)
{ {

View File

@@ -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>

View File

@@ -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)
{ {