diff --git a/Library/Api/IFlowEnvironment.cs b/Library/Api/IFlowEnvironment.cs
index f2d4214..8662879 100644
--- a/Library/Api/IFlowEnvironment.cs
+++ b/Library/Api/IFlowEnvironment.cs
@@ -319,7 +319,7 @@ namespace Serein.Library.Api
///
/// IOC容器发生变化
///
- public delegate void IOCMembersChangedHandler();
+ public delegate void IOCMembersChangedHandler(IOCMembersChangedEventArgs eventArgs);
///
@@ -338,18 +338,39 @@ namespace Serein.Library.Api
///
Completeuild,
}
- public IOCMembersChangedEventArgs(Type[] types, object[] dependencies, object[] unfinishedDependencies)
+ public IOCMembersChangedEventArgs(string key, object instance)
{
- this.Types = types;
- this.Dependencies = dependencies;
- this.UnfinishedDependencies = unfinishedDependencies;
+ this.Key = key;
+ this.Instance = instance;
}
- public Type[] Types { get; protected set; }
- public object[] Dependencies { get; private set; }
- public object[] UnfinishedDependencies { get; private set; }
+ public string Key { get; private set; }
+ public object Instance { get; private set; }
}
+ //public class IOCMembersChangedEventArgs : FlowEventArgs
+ //{
+ // //public enum EventType
+ // //{
+ // // ///
+ // // /// 登记了类型
+ // // ///
+ // // Registered,
+ // // ///
+ // // /// 构建了类型
+ // // ///
+ // // Completeuild,
+ // //}
+ // public IOCMembersChangedEventArgs(Type[] types, object[] dependencies, object[] unfinishedDependencies)
+ // {
+ // this.Types = types;
+ // this.Dependencies = dependencies;
+ // this.UnfinishedDependencies = unfinishedDependencies;
+ // }
+ // public Type[] Types { get; protected set; }
+ // public object[] Dependencies { get; private set; }
+ // public object[] UnfinishedDependencies { get; private set; }
+ //}
public interface IFlowEnvironment
{
#region 属性
@@ -420,9 +441,26 @@ namespace Serein.Library.Api
///
event ExpInterruptTriggerHandler OnInterruptTrigger;
+ ///
+ /// IOC容器发生改变
+ ///
+ event IOCMembersChangedHandler OnIOCMembersChanged;
+
#endregion
+
+ ///
+ /// 获取方法描述
+ ///
+ ///
+ ///
+ ///
+ bool TryGetMethodDetails(string methodName, out MethodDetails md);
+
+
+ //bool TryGetNodeData(string methodName, out NodeData node);
+
#region Workbench
///
@@ -445,14 +483,7 @@ namespace Serein.Library.Api
/// 清理加载的DLL(待更改)
///
void ClearAll();
- ///
- /// 获取方法描述
- ///
- ///
- ///
- ///
- bool TryGetMethodDetails(string methodName, out MethodDetails md);
-
+
///
/// 开始运行
@@ -517,7 +548,7 @@ namespace Serein.Library.Api
///
///
///
- bool AddInterruptExpression(object obj, string expression);
+ bool AddInterruptExpression(string key, string expression);
///
/// 添加作用于指定节点的中断表达式
///
@@ -538,7 +569,7 @@ namespace Serein.Library.Api
///
/// 需要监视的对象
/// 是否启用监视
- void SetMonitorObjState(object obj, bool isMonitor);
+ void SetMonitorObjState(string key,bool isMonitor);
///
/// 检查一个对象是否处于监听状态,如果是,则传出与该对象相关的表达式(用于中断),如果不是,则返回false。
@@ -546,7 +577,7 @@ namespace Serein.Library.Api
/// 判断的对象
/// 表达式
///
- bool CheckObjMonitorState(object obj, out List exps);
+ bool CheckObjMonitorState(string key, out List exps);
///
diff --git a/Library/Entity/MethodDetails.cs b/Library/Entity/MethodDetails.cs
index 0b748f9..55b9155 100644
--- a/Library/Entity/MethodDetails.cs
+++ b/Library/Entity/MethodDetails.cs
@@ -37,7 +37,7 @@ namespace Serein.Library.Entity
///
/// 是否保护参数
///
- public bool IsProtectionParameter { get; set; } = true;
+ public bool IsProtectionParameter { get; set; } = false;
///
/// 作用实例的类型
diff --git a/Library/Entity/NodeData.cs b/Library/Entity/NodeData.cs
new file mode 100644
index 0000000..e0ef99e
--- /dev/null
+++ b/Library/Entity/NodeData.cs
@@ -0,0 +1,10 @@
+using System;
+using System.Collections.Generic;
+using System.Text;
+
+namespace Serein.Library.Entity
+{
+ public class NodeData
+ {
+ }
+}
diff --git a/Library/Enums/ConnectionType.cs b/Library/Enums/ConnectionType.cs
index 7a90ea3..e7706dc 100644
--- a/Library/Enums/ConnectionType.cs
+++ b/Library/Enums/ConnectionType.cs
@@ -7,25 +7,26 @@ namespace Serein.Library.Enums
public enum ConnectionType
{
///
- /// 不执行分支
+ /// 默认属性
///
None,
///
- /// 真分支
+ /// 上游分支(执行当前节点前会执行一次上游分支),默认执行。
+ ///
+ Upstream,
+ ///
+ /// 真分支(表示当前节点顺利完成)
///
IsSucceed,
///
- /// 假分支
+ /// 假分支(一般用于条件控件,条件为假时才会触发该类型的分支)
///
IsFail,
///
- /// 异常发生分支
+ /// 异常发生分支(当前节点对应的方法执行时出现非预期的异常)
///
IsError,
- ///
- /// 上游分支(执行当前节点前会执行一次上游分支)
- ///
- Upstream,
+
}
diff --git a/Library/Utils/SereinIoc.cs b/Library/Utils/SereinIoc.cs
index da5f435..15bf99f 100644
--- a/Library/Utils/SereinIoc.cs
+++ b/Library/Utils/SereinIoc.cs
@@ -33,7 +33,7 @@ namespace Serein.Library.Utils
///
private readonly ConcurrentDictionary> _unfinishedDependencies;
-
+ public event IOCMembersChangedHandler OnIOCMembersChanged;
public SereinIOC()
{
@@ -112,7 +112,7 @@ namespace Serein.Library.Utils
// 是接口类型,存在注册信息
Register(type);// 注册类型信息
value = Instantiate(implementationType); // 创建实例对象,并注入依赖
- _dependencies.TryAdd(type.FullName, value); // 登记到IOC容器中
+ CustomRegisterInstance(type.FullName, value);// 登记到IOC容器中
_typeMappings.TryRemove(type.FullName, out _); // 取消类型的注册信息
}
else
@@ -127,7 +127,7 @@ namespace Serein.Library.Utils
// 不是接口,直接注册
Register(type);// 注册类型信息
value = Instantiate(type); // 创建实例对象,并注入依赖
- _dependencies.TryAdd(type.FullName, value); // 登记到IOC容器中
+ CustomRegisterInstance(type.FullName, value);// 登记到IOC容器中
}
}
return value;
@@ -151,33 +151,26 @@ namespace Serein.Library.Utils
#region 通过名称记录或获取一个实例
-
- public void CustomRegisterInstance(string name, object instance, bool needInjectProperty = true)
+ ///
+ /// 指定key值注册一个已经实例化的实例对象
+ ///
+ ///
+ ///
+ ///
+ public void CustomRegisterInstance(string key, object instance, bool needInjectProperty = true)
{
// 不存在时才允许创建
- if (!_dependencies.ContainsKey(name))
+ if (!_dependencies.ContainsKey(key))
{
- _dependencies.TryAdd(name, instance);
+ _dependencies.TryAdd(key, instance);
}
if (needInjectProperty)
{
InjectDependencies(instance); // 注入实例需要的依赖项
}
-
- // 检查是否存在其它实例
- if (_unfinishedDependencies.TryGetValue(name, out var unfinishedPropertyList))
- {
- foreach ((object obj, PropertyInfo property) in unfinishedPropertyList)
- {
- property.SetValue(obj, instance); //注入依赖项
- }
-
- if (_unfinishedDependencies.TryRemove(name, out unfinishedPropertyList))
- {
- unfinishedPropertyList.Clear();
- }
- }
+ InjectUnfinishedDependencies(key, instance); // 检查是否存在其它实例需要该类型
+ OnIOCMembersChanged?.Invoke(new IOCMembersChangedEventArgs(key, instance));
}
public object Get(Type type)
{
@@ -237,30 +230,20 @@ namespace Serein.Library.Utils
// 遍历已注册类型
foreach (var type in _typeMappings.Values.ToArray())
{
-
- if (_dependencies.ContainsKey(type.FullName))
+ if (!_dependencies.ContainsKey(type.FullName))
{
- // 已经存在实例,不用管
+ var value = CreateInstance(type); // 绑定时注册的类型如果没有创建实例,则创建对应的实例
+ CustomRegisterInstance(type.FullName, value);// 登记到IOC容器中
}
- else
- {
- // 如果没有创建实例,则创建对应的实例
- _dependencies[type.FullName] = CreateInstance(type);
- }
- // 移除类型的注册记录
- _typeMappings.TryRemove(type.FullName, out _);
+ _typeMappings.TryRemove(type.FullName, out _); // 移除类型的注册记录
}
- // 注入实例的依赖项
+
foreach (var instance in _dependencies.Values)
{
- InjectDependencies(instance);
+ InjectDependencies(instance); // 绑定时注入实例的依赖项
}
- //var instance = Instantiate(item.Value);
-
- // TryInstantiateWaitingDependencies();
-
return true;
}
#endregion
@@ -292,19 +275,24 @@ namespace Serein.Library.Utils
private object CreateInstance(Type type, params object[] parameters)
{
var instance = Activator.CreateInstance(type);
- if (_unfinishedDependencies.TryGetValue(type.FullName, out var unfinishedPropertyList))
+ InjectUnfinishedDependencies(type.FullName, instance);
+ return instance;
+ }
+
+ private void InjectUnfinishedDependencies(string key,object instance)
+ {
+ if (_unfinishedDependencies.TryGetValue(key, out var unfinishedPropertyList))
{
foreach ((object obj, PropertyInfo property) in unfinishedPropertyList)
{
property.SetValue(obj, instance); //注入依赖项
}
- if (_unfinishedDependencies.TryRemove(type.FullName, out unfinishedPropertyList))
+ if (_unfinishedDependencies.TryRemove(key, out unfinishedPropertyList))
{
unfinishedPropertyList.Clear();
}
}
- return instance;
}
diff --git a/NodeFlow/Base/NodeModelBaseData.cs b/NodeFlow/Base/NodeModelBaseData.cs
index 6a98e7a..115b2d5 100644
--- a/NodeFlow/Base/NodeModelBaseData.cs
+++ b/NodeFlow/Base/NodeModelBaseData.cs
@@ -7,17 +7,14 @@ namespace Serein.NodeFlow.Base
///
/// 节点基类(数据):条件控件,动作控件,条件区域,动作区域
///
- public abstract partial class NodeModelBase :IDynamicFlowNode
+ public abstract partial class NodeModelBase : IDynamicFlowNode
{
- private static readonly ConnectionType[] ct = [ConnectionType.IsSucceed,
- ConnectionType.IsFail,
- ConnectionType.IsError,
- ConnectionType.Upstream];
+
public NodeModelBase()
{
PreviousNodes = [];
SuccessorNodes = [];
- foreach (ConnectionType ctType in ct)
+ foreach (ConnectionType ctType in NodeStaticConfig.ConnectionTypes)
{
PreviousNodes[ctType] = [];
SuccessorNodes[ctType] = [];
@@ -71,6 +68,9 @@ namespace Serein.NodeFlow.Base
///
public Dictionary> SuccessorNodes { get; }
+ ///
+ /// 当前节点执行完毕后需要执行的下一个分支的类别
+ ///
public ConnectionType NextOrientation { get; set; } = ConnectionType.None;
///
diff --git a/NodeFlow/Base/NodeModelBaseFunc.cs b/NodeFlow/Base/NodeModelBaseFunc.cs
index 441c00c..a3cdb30 100644
--- a/NodeFlow/Base/NodeModelBaseFunc.cs
+++ b/NodeFlow/Base/NodeModelBaseFunc.cs
@@ -426,10 +426,10 @@ namespace Serein.NodeFlow.Base
private static async Task MonitorObjExpInterrupt(IDynamicContext context, NodeModelBase nodeModel, object data, int type)
{
MonitorObjectEventArgs.ObjSourceType sourceType;
- object key;
+ string key;
if(type == 0)
{
- key = data;
+ key = data.GetType().FullName;
sourceType = MonitorObjectEventArgs.ObjSourceType.IOCObj;
}
else
@@ -450,6 +450,7 @@ namespace Serein.NodeFlow.Base
for (int i = 0; i < exps.Count && !isExpInterrupt; i++)
{
exp = exps[i];
+ if (string.IsNullOrEmpty(exp)) continue;
isExpInterrupt = SereinConditionParser.To(data, exp);
}
@@ -458,7 +459,7 @@ namespace Serein.NodeFlow.Base
InterruptClass interruptClass = InterruptClass.Branch; // 分支中断
if (context.Env.SetNodeInterrupt(nodeModel.Guid, interruptClass))
{
- context.Env.TriggerInterrupt(nodeModel.Guid, exp, InterruptTriggerEventArgs.InterruptTriggerType.Obj);
+ context.Env.TriggerInterrupt(nodeModel.Guid, exp, InterruptTriggerEventArgs.InterruptTriggerType.Exp);
var cancelType = await nodeModel.DebugSetting.GetInterruptTask();
await Console.Out.WriteLineAsync($"[{data}]中断已{cancelType},开始执行后继分支");
}
diff --git a/NodeFlow/FlowEnvironment.cs b/NodeFlow/FlowEnvironment.cs
index cd09371..2851f82 100644
--- a/NodeFlow/FlowEnvironment.cs
+++ b/NodeFlow/FlowEnvironment.cs
@@ -55,8 +55,12 @@ namespace Serein.NodeFlow
FlipflopNodes = new List();
IsGlobalInterrupt = false;
flowStarter = null;
+
+ sereinIOC.OnIOCMembersChanged += e => this?.OnIOCMembersChanged?.Invoke(e) ; // 监听IOC容器的注册
}
+
+
///
/// 节点的命名空间
///
@@ -113,6 +117,11 @@ namespace Serein.NodeFlow
///
public event ExpInterruptTriggerHandler OnInterruptTrigger;
+ ///
+ /// 容器改变
+ ///
+ public event IOCMembersChangedHandler OnIOCMembersChanged;
+
#endregion
#region 属性
@@ -133,13 +142,14 @@ namespace Serein.NodeFlow
public ChannelFlowInterrupt ChannelFlowInterrupt { get; set; }
public ISereinIOC IOC { get => this; }
+
#endregion
#region 私有变量
///
/// 容器管理
///
- private SereinIOC sereinIOC;
+ private readonly SereinIOC sereinIOC;
///
/// 存储加载的程序集路径
@@ -666,9 +676,9 @@ namespace Serein.NodeFlow
///
///
///
- public bool AddInterruptExpression(object obj, string expression)
+ public bool AddInterruptExpression(string key, string expression)
{
- if (dictMonitorObjExpInterrupt.TryGetValue(obj, out var condition))
+ if (dictMonitorObjExpInterrupt.TryGetValue(key, out var condition))
{
condition.Clear(); // 暂时
condition.Add(expression);// 暂时
@@ -678,7 +688,7 @@ namespace Serein.NodeFlow
{
var exps = new List();
exps.Add(expression);
- dictMonitorObjExpInterrupt.TryAdd(obj, exps);
+ dictMonitorObjExpInterrupt.TryAdd(key, exps);
return true;
}
}
@@ -735,7 +745,7 @@ namespace Serein.NodeFlow
///
/// 要监视的对象,以及与其关联的表达式
///
- private ConcurrentDictionary