mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-03-13 21:16:35 +08:00
对象预览器支持了值类型集合成员的简单预览
This commit is contained in:
@@ -4,10 +4,23 @@ using System.Threading.Tasks;
|
||||
|
||||
namespace Serein.Library.Api
|
||||
{
|
||||
/// <summary>
|
||||
/// 流程上下文
|
||||
/// </summary>
|
||||
public interface IDynamicContext
|
||||
{
|
||||
IFlowEnvironment FlowEnvironment { get; }
|
||||
ISereinIOC SereinIoc { get; }
|
||||
Task CreateTimingTask(Action action, int time = 100, int count = -1);
|
||||
/// <summary>
|
||||
/// 运行环境
|
||||
/// </summary>
|
||||
IFlowEnvironment Env { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 定时循环触发
|
||||
/// </summary>
|
||||
/// <param name="callback"></param>
|
||||
/// <param name="time"></param>
|
||||
/// <param name="count"></param>
|
||||
/// <returns></returns>
|
||||
Task CreateTimingTask(Action callback, int time = 100, int count = -1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -47,6 +47,26 @@ namespace Serein.Library.Api
|
||||
/// </summary>
|
||||
/// <param name="eventArgs"></param>
|
||||
public delegate void StartNodeChangeHandler(StartNodeChangeEventArgs eventArgs);
|
||||
|
||||
/// <summary>
|
||||
/// 被监视的对象改变事件
|
||||
/// </summary>
|
||||
/// <param name="eventArgs"></param>
|
||||
public delegate void MonitorObjectChangeHandler(MonitorObjectEventArgs eventArgs);
|
||||
|
||||
/// <summary>
|
||||
/// 节点中断状态改变事件(开启了中断/取消了中断)
|
||||
/// </summary>
|
||||
/// <param name="eventArgs"></param>
|
||||
public delegate void NodeInterruptStateChangeHandler(NodeInterruptStateChangeEventArgs eventArgs);
|
||||
|
||||
/// <summary>
|
||||
/// 节点触发中断事件
|
||||
/// </summary>
|
||||
/// <param name="eventArgs"></param>
|
||||
public delegate void ExpInterruptTriggerHandler(InterruptTriggerEventArgs eventArgs);
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region 环境事件签名
|
||||
@@ -210,45 +230,35 @@ namespace Serein.Library.Api
|
||||
/// </summary>
|
||||
public string NewNodeGuid { get; private set; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 被监视的对象改变事件
|
||||
/// </summary>
|
||||
/// <param name="eventArgs"></param>
|
||||
public delegate void MonitorObjectChangeHandler(MonitorObjectEventArgs eventArgs);
|
||||
/// <summary>
|
||||
/// 节点中断状态改变事件(开启了中断/取消了中断)
|
||||
/// </summary>
|
||||
/// <param name="eventArgs"></param>
|
||||
public delegate void NodeInterruptStateChangeHandler(NodeInterruptStateChangeEventArgs eventArgs);
|
||||
/// <summary>
|
||||
/// 节点触发中断事件
|
||||
/// </summary>
|
||||
/// <param name="eventArgs"></param>
|
||||
public delegate void ExpInterruptTriggerHandler(InterruptTriggerEventArgs eventArgs);
|
||||
|
||||
/// <summary>
|
||||
/// 监视的节点数据发生变化
|
||||
/// </summary>
|
||||
public class MonitorObjectEventArgs : FlowEventArgs
|
||||
{
|
||||
public MonitorObjectEventArgs(string nodeGuid,object newData)
|
||||
public enum ObjSourceType
|
||||
{
|
||||
NodeFlowData,
|
||||
IOCObj,
|
||||
}
|
||||
public MonitorObjectEventArgs(string nodeGuid, object monitorData, ObjSourceType objSourceType)
|
||||
{
|
||||
NodeGuid = nodeGuid;
|
||||
NewData = newData;
|
||||
NewData = monitorData;
|
||||
ObjSource = objSourceType;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 中断的节点Guid
|
||||
/// </summary>
|
||||
public string NodeGuid { get; protected set; }
|
||||
|
||||
public ObjSourceType ObjSource { get; protected set; }
|
||||
/// <summary>
|
||||
/// 新的数据
|
||||
/// </summary>
|
||||
public object NewData { get; protected set; }
|
||||
public object NewData { get; protected set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -256,7 +266,7 @@ namespace Serein.Library.Api
|
||||
/// </summary>
|
||||
public class NodeInterruptStateChangeEventArgs : FlowEventArgs
|
||||
{
|
||||
public NodeInterruptStateChangeEventArgs(string nodeGuid,InterruptClass @class)
|
||||
public NodeInterruptStateChangeEventArgs(string nodeGuid, InterruptClass @class)
|
||||
{
|
||||
NodeGuid = nodeGuid;
|
||||
Class = @class;
|
||||
@@ -283,6 +293,10 @@ namespace Serein.Library.Api
|
||||
/// 表达式中断
|
||||
/// </summary>
|
||||
Exp,
|
||||
/// <summary>
|
||||
/// 对象监视中断
|
||||
/// </summary>
|
||||
Obj,
|
||||
}
|
||||
|
||||
public InterruptTriggerEventArgs(string nodeGuid, string expression, InterruptTriggerType type)
|
||||
@@ -299,26 +313,62 @@ namespace Serein.Library.Api
|
||||
public string Expression { get; protected set; }
|
||||
public InterruptTriggerType Type { get; protected set; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// IOC容器发生变化
|
||||
/// </summary>
|
||||
public delegate void IOCMembersChangedHandler();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 流程事件签名基类
|
||||
/// </summary>
|
||||
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 属性
|
||||
/// <summary>
|
||||
/// IOC容器
|
||||
/// </summary>
|
||||
ISereinIOC IOC { get; }
|
||||
|
||||
/// <summary>
|
||||
/// 环境名称
|
||||
/// </summary>
|
||||
string EnvName {get;}
|
||||
string EnvName { get; }
|
||||
/// <summary>
|
||||
/// 是否全局中断
|
||||
/// </summary>
|
||||
bool IsGlobalInterrupt { get; }
|
||||
/// <summary>
|
||||
/// 设置中断时的中断级别
|
||||
/// </summary>
|
||||
//InterruptClass EnvInterruptClass { get; set; }
|
||||
bool IsGlobalInterrupt { get; }
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 调试管理
|
||||
/// </summary>
|
||||
//ChannelFlowInterrupt ChannelFlowInterrupt { get; set; }
|
||||
#region 事件
|
||||
|
||||
/// <summary>
|
||||
/// 加载Dll
|
||||
@@ -371,6 +421,10 @@ namespace Serein.Library.Api
|
||||
event ExpInterruptTriggerHandler OnInterruptTrigger;
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region Workbench
|
||||
|
||||
/// <summary>
|
||||
/// 保存当前项目
|
||||
/// </summary>
|
||||
@@ -397,13 +451,20 @@ namespace Serein.Library.Api
|
||||
/// <param name="name"></param>
|
||||
/// <param name="md"></param>
|
||||
/// <returns></returns>
|
||||
bool TryGetMethodDetails(string methodName,out MethodDetails md);
|
||||
bool TryGetMethodDetails(string methodName, out MethodDetails md);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 开始运行
|
||||
/// </summary>
|
||||
Task StartAsync();
|
||||
/// <summary>
|
||||
/// 从选定的节点开始运行
|
||||
/// </summary>
|
||||
/// <param name="startNodeGuid"></param>
|
||||
/// <returns></returns>
|
||||
Task StartFlowInSelectNodeAsync(string startNodeGuid);
|
||||
|
||||
/// <summary>
|
||||
/// 结束运行
|
||||
/// </summary>
|
||||
@@ -442,7 +503,6 @@ namespace Serein.Library.Api
|
||||
/// <param name="nodeGuid">待移除的节点Guid</param>
|
||||
void RemoteNode(string nodeGuid);
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 设置节点中断级别
|
||||
/// </summary>
|
||||
@@ -452,38 +512,42 @@ namespace Serein.Library.Api
|
||||
bool SetNodeInterrupt(string nodeGuid, InterruptClass interruptClass);
|
||||
|
||||
/// <summary>
|
||||
/// 添加中断表达式
|
||||
/// 添加作用于某个对象的中断表达式
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
/// <param name="expression"></param>
|
||||
/// <returns></returns>
|
||||
bool AddInterruptExpression(string nodeGuid,string expression);
|
||||
bool AddInterruptExpression(object obj, string expression);
|
||||
/// <summary>
|
||||
/// 添加作用于指定节点的中断表达式
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid"></param>
|
||||
/// <param name="expression"></param>
|
||||
/// <returns></returns>
|
||||
// bool AddInterruptExpression(string nodeGuid,string expression);
|
||||
|
||||
// <summary>
|
||||
// 设置节点数据监视状态
|
||||
// </summary>
|
||||
// <param name="nodeGuid">需要监视的节点Guid</param>
|
||||
// <param name="isMonitor">是否监视</param>
|
||||
// void SetNodeFLowDataMonitorState(string nodeGuid, bool isMonitor);
|
||||
|
||||
/// <summary>
|
||||
/// 设置节点数据监视状态
|
||||
/// 监视指定对象
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">需要监视的节点Guid</param>
|
||||
/// <param name="isMonitor">是否监视</param>
|
||||
void SetNodeFLowDataMonitorState(string nodeGuid, bool isMonitor);
|
||||
|
||||
|
||||
|
||||
|
||||
/// <param name="obj">需要监视的对象</param>
|
||||
/// <param name="isMonitor">是否启用监视</param>
|
||||
void SetMonitorObjState(object obj, bool isMonitor);
|
||||
|
||||
/// <summary>
|
||||
/// 流程启动器调用,节点数据更新通知
|
||||
/// 检查一个对象是否处于监听状态,如果是,则传出与该对象相关的表达式(用于中断),如果不是,则返回false。
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">更新了数据的节点Guid</param>
|
||||
/// <param name="flowData">更新的数据</param>
|
||||
void FlowDataNotification(string nodeGuid, object flowData);
|
||||
/// <param name="obj">判断的对象</param>
|
||||
/// <param name="exps">表达式</param>
|
||||
/// <returns></returns>
|
||||
bool CheckObjMonitorState(object obj, out List<string> exps);
|
||||
|
||||
/// <summary>
|
||||
/// 流程启动器调用,节点触发了中断
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">被中断的节点Guid</param>
|
||||
/// <param name="expression">被触发的表达式</param>
|
||||
/// <param name="type">中断类型。0主动监视,1表达式</param>
|
||||
void TriggerInterrupt(string nodeGuid,string expression, InterruptTriggerEventArgs.InterruptTriggerType type);
|
||||
|
||||
/// <summary>
|
||||
/// 全局中断
|
||||
@@ -494,6 +558,26 @@ namespace Serein.Library.Api
|
||||
Task<CancelType> GetOrCreateGlobalInterruptAsync();
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
#region Start
|
||||
|
||||
/// <summary>
|
||||
/// 流程启动器调用,监视数据更新通知
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">更新了数据的节点Guid</param>
|
||||
/// <param name="flowData">更新的数据</param>
|
||||
void MonitorObjectNotification(string nodeGuid, object monitorData, MonitorObjectEventArgs.ObjSourceType sourceType);
|
||||
|
||||
/// <summary>
|
||||
/// 流程启动器调用,节点触发了中断
|
||||
/// </summary>
|
||||
/// <param name="nodeGuid">被中断的节点Guid</param>
|
||||
/// <param name="expression">被触发的表达式</param>
|
||||
/// <param name="type">中断类型。0主动监视,1表达式</param>
|
||||
void TriggerInterrupt(string nodeGuid, string expression, InterruptTriggerEventArgs.InterruptTriggerType type);
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,31 +15,63 @@ namespace Serein.Library.Api
|
||||
/// 注册实例
|
||||
/// </summary>
|
||||
ISereinIOC Register(Type type, params object[] parameters);
|
||||
/// <summary>
|
||||
/// 注册实例
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="parameters"></param>
|
||||
/// <returns></returns>
|
||||
ISereinIOC Register<T>(params object[] parameters);
|
||||
/// <summary>
|
||||
/// 注册接口的实例
|
||||
/// </summary>
|
||||
/// <typeparam name="TService"></typeparam>
|
||||
/// <typeparam name="TImplementation"></typeparam>
|
||||
/// <param name="parameters"></param>
|
||||
/// <returns></returns>
|
||||
ISereinIOC Register<TService, TImplementation>(params object[] parameters) where TImplementation : TService;
|
||||
/// <summary>
|
||||
/// 获取或创建并注入目标类型
|
||||
/// 获取或创建并注入目标类型,会记录到IOC容器中。
|
||||
/// </summary>
|
||||
T GetOrRegisterInstantiate<T>();
|
||||
/// <summary>
|
||||
/// 获取或创建并注入目标类型
|
||||
/// 获取或创建并注入目标类型,会记录到IOC容器中。
|
||||
/// </summary>
|
||||
object GetOrRegisterInstantiate(Type type);
|
||||
/// <summary>
|
||||
/// 获取类型的实例
|
||||
/// </summary>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
object Get(Type type);
|
||||
|
||||
|
||||
T Get<T>(string name);
|
||||
object Get(string name);
|
||||
void CustomRegisterInstance(string name, object instance, bool needInjectProperty = true);
|
||||
|
||||
ISereinIOC Run<T>(string name, Action<T> action);
|
||||
|
||||
/// <summary>
|
||||
/// 获取指定名称的实例
|
||||
/// </summary>
|
||||
/// <typeparam name="T"></typeparam>
|
||||
/// <param name="key"></param>
|
||||
/// <returns></returns>
|
||||
T Get<T>(string key);
|
||||
|
||||
/// <summary>
|
||||
/// 创建目标类型的对象, 并注入依赖项
|
||||
/// 通过名称注册实例
|
||||
/// </summary>
|
||||
/// <param name="key">注入名称</param>
|
||||
/// <param name="instance">实例对象</param>
|
||||
/// <param name="needInjectProperty">是否需要注入依赖项</param>
|
||||
void CustomRegisterInstance(string key, object instance, bool needInjectProperty = true);
|
||||
|
||||
/// <summary>
|
||||
/// 用于临时实例的创建,不注册到IOC容器中,依赖项注入失败时也不记录。
|
||||
/// </summary>
|
||||
object Instantiate(Type type, params object[] parameters);
|
||||
|
||||
/// <summary>
|
||||
/// 实例化注册的类型,并注入依赖项
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
ISereinIOC Build();
|
||||
|
||||
ISereinIOC Run<T>(Action<T> action);
|
||||
ISereinIOC Run<T1, T2>(Action<T1, T2> action);
|
||||
ISereinIOC Run<T1, T2, T3>(Action<T1, T2, T3> action);
|
||||
|
||||
@@ -16,7 +16,7 @@ namespace Serein.Library.Entity
|
||||
/// <summary>
|
||||
/// 是否监视数据改变
|
||||
/// </summary>
|
||||
public bool IsMonitorFlowData { get; set; } = false;
|
||||
// public bool IsMonitorFlowData { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// 中断级别,暂时停止继续执行后继分支。
|
||||
@@ -26,8 +26,7 @@ namespace Serein.Library.Entity
|
||||
/// <summary>
|
||||
/// 中断表达式
|
||||
/// </summary>
|
||||
public List<string> InterruptExpressions { get; } = new List<string>();
|
||||
|
||||
// public List<string> InterruptExpressions { get; } = new List<string>();
|
||||
|
||||
/// <summary>
|
||||
/// 取消中断的回调函数
|
||||
|
||||
@@ -14,7 +14,7 @@ namespace Serein.Library.Utils
|
||||
/// <summary>
|
||||
/// IOC管理容器
|
||||
/// </summary>
|
||||
public class SereinIOC : ISereinIOC
|
||||
public class SereinIOC/* : ISereinIOC*/
|
||||
{
|
||||
/// <summary>
|
||||
/// 类型集合,暂放待实例化的类型,完成实例化之后移除
|
||||
@@ -22,7 +22,7 @@ namespace Serein.Library.Utils
|
||||
private readonly ConcurrentDictionary<string, Type> _typeMappings;
|
||||
|
||||
/// <summary>
|
||||
/// 实例集合(包含已完成注入、未完成注入的对象实例,计划在未来的版本中区分:)
|
||||
/// 已完成注入的实例集合
|
||||
/// </summary>
|
||||
private readonly ConcurrentDictionary<string, object> _dependencies;
|
||||
|
||||
@@ -34,10 +34,6 @@ namespace Serein.Library.Utils
|
||||
private readonly ConcurrentDictionary<string, List<(object,PropertyInfo)>> _unfinishedDependencies;
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 待实例化的类型
|
||||
/// </summary>
|
||||
// private readonly List<Type> _waitingForInstantiation;
|
||||
|
||||
public SereinIOC()
|
||||
{
|
||||
@@ -49,13 +45,13 @@ namespace Serein.Library.Utils
|
||||
|
||||
public void InitRegister()
|
||||
{
|
||||
_dependencies[typeof(ISereinIOC).FullName] = this;
|
||||
//_dependencies[typeof(ISereinIOC).FullName] = this;
|
||||
Register<IRouter, Router>();
|
||||
/*foreach (var type in _typeMappings.Values)
|
||||
{
|
||||
Register(type);
|
||||
}
|
||||
Build();*/
|
||||
//foreach (var type in _typeMappings.Values)
|
||||
//{
|
||||
// Register(type);
|
||||
//}
|
||||
//Build();
|
||||
}
|
||||
|
||||
#region 类型的注册
|
||||
@@ -65,21 +61,19 @@ namespace Serein.Library.Utils
|
||||
/// </summary>
|
||||
/// <param name="type">目标类型</param>
|
||||
/// <param name="parameters">参数</param>
|
||||
public ISereinIOC Register(Type type, params object[] parameters)
|
||||
public bool Register(Type type, params object[] parameters)
|
||||
{
|
||||
RegisterType(type?.FullName, type);
|
||||
return this;
|
||||
return RegisterType(type?.FullName, type);
|
||||
}
|
||||
/// <summary>
|
||||
/// 注册类型
|
||||
/// </summary>
|
||||
/// <param name="type">目标类型</param>
|
||||
/// <param name="parameters">参数</param>
|
||||
public ISereinIOC Register<T>(params object[] parameters)
|
||||
public bool Register<T>(params object[] parameters)
|
||||
{
|
||||
var type = typeof(T);
|
||||
RegisterType(type.FullName, type);
|
||||
return this;
|
||||
return RegisterType(type.FullName, type);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -87,14 +81,20 @@ namespace Serein.Library.Utils
|
||||
/// </summary>
|
||||
/// <param name="type">目标类型</param>
|
||||
/// <param name="parameters">参数</param>
|
||||
public ISereinIOC Register<TService, TImplementation>(params object[] parameters)
|
||||
public bool Register<TService, TImplementation>(params object[] parameters)
|
||||
where TImplementation : TService
|
||||
{
|
||||
RegisterType(typeof(TService).FullName, typeof(TImplementation));
|
||||
return this;
|
||||
return RegisterType(typeof(TService).FullName, typeof(TImplementation));
|
||||
}
|
||||
#endregion
|
||||
|
||||
/// <summary>
|
||||
/// 尝试从容器中获取对象,如果不存在目标类型的对象,则将类型信息登记到容器,并实例化注入依赖项。如果依然无法注册,则返回null。
|
||||
/// </summary>
|
||||
public T GetOrRegisterInstantiate<T>()
|
||||
{
|
||||
return (T)GetOrRegisterInstantiate(typeof(T));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试从容器中获取对象,如果不存在目标类型的对象,则将类型信息登记到容器,并实例化注入依赖项。如果依然无法注册,则返回null。
|
||||
@@ -134,16 +134,25 @@ namespace Serein.Library.Utils
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试从容器中获取对象,如果不存在目标类型的对象,则将类型信息登记到容器,并实例化注入依赖项。如果依然无法注册,则返回null。
|
||||
/// 用于临时实例的创建,不登记到IOC容器中,依赖项注入失败时也不记录。
|
||||
/// </summary>
|
||||
public T GetOrRegisterInstantiate<T>()
|
||||
/// <param name="controllerType"></param>
|
||||
/// <param name="parameters"></param>
|
||||
/// <returns></returns>
|
||||
public object Instantiate(Type controllerType, params object[] parameters)
|
||||
{
|
||||
return (T)GetOrRegisterInstantiate(typeof(T));
|
||||
var instance = Activator.CreateInstance(controllerType, parameters); // CreateInstance(controllerType, parameters); // 创建目标类型的实例
|
||||
if (instance != null)
|
||||
{
|
||||
InjectDependencies(instance, false); // 完成创建后注入实例需要的依赖项
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
#region 通过名称记录或获取一个实例
|
||||
|
||||
|
||||
public void CustomRegisterInstance(string name,object instance, bool needInjectProperty = true)
|
||||
public void CustomRegisterInstance(string name, object instance, bool needInjectProperty = true)
|
||||
{
|
||||
// 不存在时才允许创建
|
||||
if (!_dependencies.ContainsKey(name))
|
||||
@@ -151,7 +160,7 @@ namespace Serein.Library.Utils
|
||||
_dependencies.TryAdd(name, instance);
|
||||
}
|
||||
|
||||
if (needInjectProperty)
|
||||
if (needInjectProperty)
|
||||
{
|
||||
InjectDependencies(instance); // 注入实例需要的依赖项
|
||||
}
|
||||
@@ -180,7 +189,7 @@ namespace Serein.Library.Utils
|
||||
{
|
||||
return (T)Get(name);
|
||||
}
|
||||
public object Get(string name)
|
||||
private object Get(string name)
|
||||
{
|
||||
object value;
|
||||
if (!_dependencies.TryGetValue(name, out value))
|
||||
@@ -190,23 +199,10 @@ namespace Serein.Library.Utils
|
||||
return value;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据类型生成对应的实例,并注入其中的依赖项(类型信息不登记到IOC容器中),类型创建后自动注入其它需要此类型的对象
|
||||
/// </summary>
|
||||
/// <param name="controllerType"></param>
|
||||
/// <param name="parameters"></param>
|
||||
/// <returns></returns>
|
||||
public object Instantiate(Type controllerType, params object[] parameters)
|
||||
{
|
||||
var instance = CreateInstance(controllerType, parameters); // 创建目标类型的实例
|
||||
if(instance != null)
|
||||
{
|
||||
InjectDependencies(instance); // 完成创建后注入实例需要的依赖项
|
||||
}
|
||||
return instance;
|
||||
}
|
||||
|
||||
#region 容器管理(清空,绑定)
|
||||
|
||||
@@ -214,7 +210,7 @@ namespace Serein.Library.Utils
|
||||
/// 清空容器对象
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public ISereinIOC Reset()
|
||||
public bool Reset()
|
||||
{
|
||||
// 检查是否存在非托管资源
|
||||
foreach (var instancei in _dependencies.Values)
|
||||
@@ -228,14 +224,14 @@ namespace Serein.Library.Utils
|
||||
_typeMappings?.Clear();
|
||||
_dependencies?.Clear();
|
||||
// _waitingForInstantiation?.Clear();
|
||||
return this;
|
||||
return true;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 实例化所有已注册的类型,并尝试绑定
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public ISereinIOC Build()
|
||||
public bool Build()
|
||||
{
|
||||
InitRegister();
|
||||
// 遍历已注册类型
|
||||
@@ -265,7 +261,7 @@ namespace Serein.Library.Utils
|
||||
|
||||
// TryInstantiateWaitingDependencies();
|
||||
|
||||
return this;
|
||||
return true;
|
||||
}
|
||||
#endregion
|
||||
|
||||
@@ -277,11 +273,16 @@ namespace Serein.Library.Utils
|
||||
/// </summary>
|
||||
/// <param name="typeFull"></param>
|
||||
/// <param name="type"></param>
|
||||
private void RegisterType(string typeFull, Type type)
|
||||
private bool RegisterType(string typeFull, Type type)
|
||||
{
|
||||
if (!_typeMappings.ContainsKey(typeFull))
|
||||
{
|
||||
_typeMappings[typeFull] = type;
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -310,8 +311,9 @@ namespace Serein.Library.Utils
|
||||
/// <summary>
|
||||
/// 注入目标实例的依赖项
|
||||
/// </summary>
|
||||
/// <param name="instance"></param>
|
||||
private bool InjectDependencies(object instance)
|
||||
/// <param name="instance">实例</param>
|
||||
/// <param name="isRecord">未完成依赖项注入时是否记录</param>
|
||||
private bool InjectDependencies(object instance,bool isRecord = true)
|
||||
{
|
||||
var properties = instance.GetType()
|
||||
.GetProperties(BindingFlags.Instance | BindingFlags.Public).ToArray()
|
||||
@@ -327,7 +329,7 @@ namespace Serein.Library.Utils
|
||||
{
|
||||
property.SetValue(instance, dependencyInstance); // 尝试写入到目标实例的属性中
|
||||
}
|
||||
else
|
||||
else if(isRecord)
|
||||
{
|
||||
// 存在依赖项,但目标类型的实例暂未加载,需要等待需要实例完成注册
|
||||
var unfinishedDependenciesList = _unfinishedDependencies.GetOrAdd(propertyType.FullName, _ = new List<(object, PropertyInfo)>());
|
||||
@@ -366,66 +368,62 @@ namespace Serein.Library.Utils
|
||||
#endregion
|
||||
|
||||
#region run()
|
||||
public ISereinIOC Run<T>(string name, Action<T> action)
|
||||
{
|
||||
var obj = Get(name);
|
||||
if (obj != null)
|
||||
{
|
||||
if(obj is T service)
|
||||
{
|
||||
try
|
||||
{
|
||||
action(service);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
//public bool Run<T>(string name, Action<T> action)
|
||||
//{
|
||||
// var obj = Get(name);
|
||||
// if (obj != null)
|
||||
// {
|
||||
// if(obj is T service)
|
||||
// {
|
||||
// try
|
||||
// {
|
||||
// action(service);
|
||||
// }
|
||||
// catch (Exception ex)
|
||||
// {
|
||||
// Console.WriteLine(ex.Message);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// return this;
|
||||
//}
|
||||
|
||||
|
||||
public ISereinIOC Run<T>(Action<T> action)
|
||||
public void Run<T>(Action<T> action)
|
||||
{
|
||||
var service = GetOrRegisterInstantiate<T>();
|
||||
if (service != null)
|
||||
{
|
||||
action(service);
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public ISereinIOC Run<T1, T2>(Action<T1, T2> action)
|
||||
public void Run<T1, T2>(Action<T1, T2> action)
|
||||
{
|
||||
var service1 = GetOrRegisterInstantiate<T1>();
|
||||
var service2 = GetOrRegisterInstantiate<T2>();
|
||||
|
||||
action(service1, service2);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ISereinIOC Run<T1, T2, T3>(Action<T1, T2, T3> action)
|
||||
public void Run<T1, T2, T3>(Action<T1, T2, T3> action)
|
||||
{
|
||||
var service1 = GetOrRegisterInstantiate<T1>();
|
||||
var service2 = GetOrRegisterInstantiate<T2>();
|
||||
var service3 = GetOrRegisterInstantiate<T3>();
|
||||
action(service1, service2, service3);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ISereinIOC Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action)
|
||||
public void Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action)
|
||||
{
|
||||
var service1 = GetOrRegisterInstantiate<T1>();
|
||||
var service2 = GetOrRegisterInstantiate<T2>();
|
||||
var service3 = GetOrRegisterInstantiate<T3>();
|
||||
var service4 = GetOrRegisterInstantiate<T4>();
|
||||
action(service1, service2, service3, service4);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ISereinIOC Run<T1, T2, T3, T4, T5>(Action<T1, T2, T3, T4, T5> action)
|
||||
public void Run<T1, T2, T3, T4, T5>(Action<T1, T2, T3, T4, T5> action)
|
||||
{
|
||||
var service1 = GetOrRegisterInstantiate<T1>();
|
||||
var service2 = GetOrRegisterInstantiate<T2>();
|
||||
@@ -433,10 +431,9 @@ namespace Serein.Library.Utils
|
||||
var service4 = GetOrRegisterInstantiate<T4>();
|
||||
var service5 = GetOrRegisterInstantiate<T5>();
|
||||
action(service1, service2, service3, service4, service5);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ISereinIOC Run<T1, T2, T3, T4, T5, T6>(Action<T1, T2, T3, T4, T5, T6> action)
|
||||
public void Run<T1, T2, T3, T4, T5, T6>(Action<T1, T2, T3, T4, T5, T6> action)
|
||||
{
|
||||
var service1 = GetOrRegisterInstantiate<T1>();
|
||||
var service2 = GetOrRegisterInstantiate<T2>();
|
||||
@@ -445,10 +442,9 @@ namespace Serein.Library.Utils
|
||||
var service5 = GetOrRegisterInstantiate<T5>();
|
||||
var service6 = GetOrRegisterInstantiate<T6>();
|
||||
action(service1, service2, service3, service4, service5, service6);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ISereinIOC Run<T1, T2, T3, T4, T5, T6, T7>(Action<T1, T2, T3, T4, T5, T6, T7> action)
|
||||
public void Run<T1, T2, T3, T4, T5, T6, T7>(Action<T1, T2, T3, T4, T5, T6, T7> action)
|
||||
{
|
||||
var service1 = GetOrRegisterInstantiate<T1>();
|
||||
var service2 = GetOrRegisterInstantiate<T2>();
|
||||
@@ -458,10 +454,9 @@ namespace Serein.Library.Utils
|
||||
var service6 = GetOrRegisterInstantiate<T6>();
|
||||
var service7 = GetOrRegisterInstantiate<T7>();
|
||||
action(service1, service2, service3, service4, service5, service6, service7);
|
||||
return this;
|
||||
}
|
||||
|
||||
public ISereinIOC Run<T1, T2, T3, T4, T5, T6, T7, T8>(Action<T1, T2, T3, T4, T5, T6, T7, T8> action)
|
||||
public void Run<T1, T2, T3, T4, T5, T6, T7, T8>(Action<T1, T2, T3, T4, T5, T6, T7, T8> action)
|
||||
{
|
||||
var service1 = GetOrRegisterInstantiate<T1>();
|
||||
var service2 = GetOrRegisterInstantiate<T2>();
|
||||
@@ -472,7 +467,6 @@ namespace Serein.Library.Utils
|
||||
var service7 = GetOrRegisterInstantiate<T7>();
|
||||
var service8 = GetOrRegisterInstantiate<T8>();
|
||||
action(service1, service2, service3, service4, service5, service6, service7, service8);
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user