diff --git a/NodeFlow/Env/FlowControl.cs b/NodeFlow/Env/FlowControl.cs index 7d5ba80..faed92d 100644 --- a/NodeFlow/Env/FlowControl.cs +++ b/NodeFlow/Env/FlowControl.cs @@ -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() .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(() => 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 - - /// public void ActivateFlipflopNode(string nodeGuid) { diff --git a/NodeFlow/FlowWorkOptions.cs b/NodeFlow/FlowWorkOptions.cs index 3a81ed5..e66323c 100644 --- a/NodeFlow/FlowWorkOptions.cs +++ b/NodeFlow/FlowWorkOptions.cs @@ -54,11 +54,6 @@ namespace Serein.NodeFlow /// public Dictionary Flows { get; set; } = []; - /// - /// 需要注册的类型 - /// - public Dictionary> AutoRegisterTypes { get; set; } = []; - /// /// 初始化时需要的方法 /// diff --git a/NodeFlow/Tool/FlowWorkManagement.cs b/NodeFlow/Tool/FlowWorkManagement.cs index a823be9..59010ff 100644 --- a/NodeFlow/Tool/FlowWorkManagement.cs +++ b/NodeFlow/Tool/FlowWorkManagement.cs @@ -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(); + #region 注册所有节点所属的类的类型,如果注册失败则退出 List nodes = new List(); var flowTask = WorkOptions.Flows.Values.ToArray(); @@ -130,27 +132,37 @@ namespace Serein.NodeFlow.Services var env = WorkOptions.Environment; var ioc = WorkOptions.FlowIOC; - - + HashSet types = new HashSet(); var nodeMds = nodes.Select(item => item.MethodDetails).ToList(); // 获取环境中所有节点的方法信息 var allMds = new List(); - 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 Where(IEnumerable 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) {