mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-04-07 08:26:34 +08:00
添加了节点树视图。
This commit is contained in:
@@ -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>
|
||||
|
||||
@@ -37,7 +37,7 @@ namespace Serein.Library.Entity
|
||||
/// <summary>
|
||||
/// 是否保护参数
|
||||
/// </summary>
|
||||
public bool IsProtectionParameter { get; set; } = true;
|
||||
public bool IsProtectionParameter { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 作用实例的类型
|
||||
|
||||
10
Library/Entity/NodeData.cs
Normal file
10
Library/Entity/NodeData.cs
Normal file
@@ -0,0 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace Serein.Library.Entity
|
||||
{
|
||||
public class NodeData
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user