mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-02 15:50:47 +08:00
1. 解决了DynamicFlow标记在静态类上导致流程初始化异常的问题,现在可以使用DynamicFlow修饰静态类了
This commit is contained in:
@@ -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)
|
||||
{
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user