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 =>
{
if (!flowModelService.TryGetCanvasModel(guid, out var canvasModel))
{
SereinEnv.WriteLine(InfoType.WARN, $"画布不存在,将不会运行。{guid}");
return default;
}
if (canvasModel.StartNode is null)
{
SereinEnv.WriteLine(InfoType.WARN, $"画布不存在起始节点,将不会运行。{guid}");
return default;
}
return canvasModel;
})
if (!flowModelService.TryGetCanvasModel(guid, out var canvasModel))
{
SereinEnv.WriteLine(InfoType.WARN, $"画布不存在,将不会运行。{guid}");
return default;
}
if (canvasModel.StartNode is null)
{
SereinEnv.WriteLine(InfoType.WARN, $"画布不存在起始节点,将不会运行。{guid}");
return default;
}
return canvasModel;
})
.Where(canvasModel => canvasModel != default && canvasModel.StartNode != null)
.OfType<FlowCanvasDetails>()
.ToDictionary(key => key.Guid,
value => new FlowTask
{
GetStartNode = () => value.StartNode!,
GetNodes = () => flowModelService.GetAllNodeModel(value.Guid),
IsWaitStartFlow = false
});
{
GetStartNode = () => value.StartNode!,
GetNodes = () => flowModelService.GetAllNodeModel(value.Guid),
IsWaitStartFlow = false
});
if(flowTasks.Values.Count == 0)
@@ -181,7 +181,7 @@ namespace Serein.NodeFlow.Env
IOC.Register<IFlowEnvironment>(() => flowEnvironment);
var flowWorkManagement = GetFWM();
flowWorkManagement.WorkOptions.Flows = flowTasks;
flowWorkManagement.WorkOptions.AutoRegisterTypes = flowLibraryService.GetaAutoRegisterType(); // 需要自动实例化的类型
//flowWorkManagement.WorkOptions.AutoRegisterTypes = flowLibraryService.GetaAutoRegisterType(); // 需要自动实例化的类型
flowWorkManagement.WorkOptions.InitMds = flowLibraryService.GetMdsOnFlowStart(NodeType.Init);
flowWorkManagement.WorkOptions.LoadMds = flowLibraryService.GetMdsOnFlowStart(NodeType.Loading);
flowWorkManagement.WorkOptions.ExitMds = flowLibraryService.GetMdsOnFlowStart(NodeType.Exit);
@@ -351,8 +351,6 @@ namespace Serein.NodeFlow.Env
/// <inheritdoc/>
public void ActivateFlipflopNode(string nodeGuid)
{

View File

@@ -54,11 +54,6 @@ namespace Serein.NodeFlow
/// </summary>
public Dictionary<string, FlowTask> Flows { get; set; } = [];
/// <summary>
/// 需要注册的类型
/// </summary>
public Dictionary<RegisterSequence, List<Type>> AutoRegisterTypes { get; set; } = [];
/// <summary>
/// 初始化时需要的方法
/// </summary>

View File

@@ -10,6 +10,7 @@ using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Net.Http.Headers;
using System.Threading.Tasks.Dataflow;
using System.Xml.Linq;
@@ -54,6 +55,7 @@ namespace Serein.NodeFlow.Services
var sw = Stopwatch.StartNew();
var checkpoints = new Dictionary<string, TimeSpan>();
#region 退
List<IFlowNode> nodes = new List<IFlowNode>();
var flowTask = WorkOptions.Flows.Values.ToArray();
@@ -130,27 +132,37 @@ namespace Serein.NodeFlow.Services
var env = WorkOptions.Environment;
var ioc = WorkOptions.FlowIOC;
HashSet<Type> types = new HashSet<Type>();
var nodeMds = nodes.Select(item => item.MethodDetails).ToList(); // 获取环境中所有节点的方法信息
var allMds = new List<MethodDetails>();
allMds.AddRange(nodeMds.Where(md => md?.ActingInstanceType is not null));
allMds.AddRange(WorkOptions.InitMds.Where(md => md?.ActingInstanceType is not null));
allMds.AddRange(WorkOptions.LoadMds.Where(md => md?.ActingInstanceType is not null));
allMds.AddRange(WorkOptions.ExitMds.Where(md => md?.ActingInstanceType is not null));
IEnumerable<MethodDetails> Where(IEnumerable<MethodDetails> mds)
{
return mds.Where(md => md?.ActingInstanceType is not null && !md.ActingInstanceType.IsSealed && !md.ActingInstanceType.IsAbstract);
}
allMds.AddRange(Where(nodeMds));
allMds.AddRange(Where(WorkOptions.InitMds));
allMds.AddRange(Where(WorkOptions.ExitMds));
allMds.AddRange(Where(WorkOptions.LoadMds));
var isSuccessful = true;
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);
}
else
{
SereinEnv.WriteLine(InfoType.ERROR, "{md.MethodName} - 没有类型声明");
isSuccessful = false ;
}
}
if(types.Count == 0)
{
return true;
}
ioc.Build(); // 绑定初始化时注册的类型
foreach (var md in allMds)
{