添加了节点树视图。

This commit is contained in:
fengjiayi
2024-09-26 21:00:17 +08:00
parent e81c527086
commit 42bf85b970
24 changed files with 877 additions and 357 deletions

View File

@@ -319,7 +319,7 @@ namespace Serein.Library.Api
/// <summary>
/// IOC容器发生变化
/// </summary>
public delegate void IOCMembersChangedHandler();
public delegate void IOCMembersChangedHandler(IOCMembersChangedEventArgs eventArgs);
/// <summary>
@@ -338,18 +338,39 @@ namespace Serein.Library.Api
/// </summary>
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
// //{
// // /// <summary>
// // /// 登记了类型
// // /// </summary>
// // Registered,
// // /// <summary>
// // /// 构建了类型
// // /// </summary>
// // 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
/// </summary>
event ExpInterruptTriggerHandler OnInterruptTrigger;
/// <summary>
/// IOC容器发生改变
/// </summary>
event IOCMembersChangedHandler OnIOCMembersChanged;
#endregion
/// <summary>
/// 获取方法描述
/// </summary>
/// <param name="name"></param>
/// <param name="md"></param>
/// <returns></returns>
bool TryGetMethodDetails(string methodName, out MethodDetails md);
//bool TryGetNodeData(string methodName, out NodeData node);
#region Workbench
/// <summary>
@@ -445,14 +483,7 @@ namespace Serein.Library.Api
/// 清理加载的DLL待更改
/// </summary>
void ClearAll();
/// <summary>
/// 获取方法描述
/// </summary>
/// <param name="name"></param>
/// <param name="md"></param>
/// <returns></returns>
bool TryGetMethodDetails(string methodName, out MethodDetails md);
/// <summary>
/// 开始运行
@@ -517,7 +548,7 @@ namespace Serein.Library.Api
/// <param name="nodeGuid"></param>
/// <param name="expression"></param>
/// <returns></returns>
bool AddInterruptExpression(object obj, string expression);
bool AddInterruptExpression(string key, string expression);
/// <summary>
/// 添加作用于指定节点的中断表达式
/// </summary>
@@ -538,7 +569,7 @@ namespace Serein.Library.Api
/// </summary>
/// <param name="obj">需要监视的对象</param>
/// <param name="isMonitor">是否启用监视</param>
void SetMonitorObjState(object obj, bool isMonitor);
void SetMonitorObjState(string key,bool isMonitor);
/// <summary>
/// 检查一个对象是否处于监听状态如果是则传出与该对象相关的表达式用于中断如果不是则返回false。
@@ -546,7 +577,7 @@ namespace Serein.Library.Api
/// <param name="obj">判断的对象</param>
/// <param name="exps">表达式</param>
/// <returns></returns>
bool CheckObjMonitorState(object obj, out List<string> exps);
bool CheckObjMonitorState(string key, out List<string> exps);
/// <summary>

View File

@@ -37,7 +37,7 @@ namespace Serein.Library.Entity
/// <summary>
/// 是否保护参数
/// </summary>
public bool IsProtectionParameter { get; set; } = true;
public bool IsProtectionParameter { get; set; } = false;
/// <summary>
/// 作用实例的类型

View File

@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Serein.Library.Entity
{
public class NodeData
{
}
}

View File

@@ -7,25 +7,26 @@ namespace Serein.Library.Enums
public enum ConnectionType
{
/// <summary>
/// 不执行分支
/// 默认属性
/// </summary>
None,
/// <summary>
/// 真分支
/// 上游分支(执行当前节点前会执行一次上游分支),默认执行。
/// </summary>
Upstream,
/// <summary>
/// 真分支(表示当前节点顺利完成)
/// </summary>
IsSucceed,
/// <summary>
/// 假分支
/// 假分支(一般用于条件控件,条件为假时才会触发该类型的分支)
/// </summary>
IsFail,
/// <summary>
/// 异常发生分支
/// 异常发生分支(当前节点对应的方法执行时出现非预期的异常)
/// </summary>
IsError,
/// <summary>
/// 上游分支(执行当前节点前会执行一次上游分支)
/// </summary>
Upstream,
}

View File

@@ -33,7 +33,7 @@ namespace Serein.Library.Utils
/// </summary>
private readonly ConcurrentDictionary<string, List<(object,PropertyInfo)>> _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)
/// <summary>
/// 指定key值注册一个已经实例化的实例对象
/// </summary>
/// <param name="key"></param>
/// <param name="instance"></param>
/// <param name="needInjectProperty"></param>
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;
}