diff --git a/Library/Api/ISereinIoc.cs b/Library/Api/ISereinIoc.cs index f8f181a..447c320 100644 --- a/Library/Api/ISereinIoc.cs +++ b/Library/Api/ISereinIoc.cs @@ -5,106 +5,85 @@ using System.Text; namespace Serein.Library.Api { /// - /// 单例模式IOC容器,内部维护了一个实例字典,默认使用类型的FullName作为Key,如果以“接口-实现类”的方式注册,那么将使用接口类型的FullName作为Key。 + /// 单例模式IOC容器,内部维护了一个实例字典,默认使用类型的FullName作为Key, + /// 如果以“接口-实现类”的方式注册,那么将使用接口类型的FullName作为Key。 /// 当某个类型注册绑定成功后,将不会因为其它地方尝试注册相同类型的行为导致类型被重新创建。 /// - public interface ISereinIOC + public interface ISereinIOC { /// /// 慎用,重置IOC容器,除非再次注册绑定,否则将导致不能创建注入依赖类的临时对象。 /// /// ISereinIOC Reset(); + /// - /// 注册实例,如果确定了params,那么将使用params入参构建实例对象。 + /// 通过指定类型的方式注册实例 /// - ISereinIOC Register(Type type, params object[] parameters); - /// - /// 通过泛型的方式注册实例,如果确定了params,那么将使用params入参构建实例对象。 - /// - /// - /// + /// 实例类型 /// - ISereinIOC Register(params object[] parameters); + ISereinIOC Register(Type type); + + /// + /// 通过指定类型的方式注册实例 + /// + /// 实例类型 + /// 获取实例的回调函数 + /// + ISereinIOC Register(Type type, Func getInstance); + + /// + /// 通过泛型的方式注册实例 + /// + /// 实例类型 + /// 获取实例的回调函数 + /// + ISereinIOC Register(Func getInstance); + /// /// 注册接口的实例 /// /// 接口类型 /// 实例类型 - /// + /// 获取实例的回调函数 /// - ISereinIOC Register(params object[] parameters) where TImplementation : TService; + ISereinIOC Register(Func getInstance) where TImplementation : TService; /// - /// 指定一个Key登记一个持久化的实例。 + /// 注册接口的实现类 /// - /// 登记使用的名称 - /// 实例对象 - /// 是否注册成功 - bool RegisterPersistennceInstance(string key, object instance); - - /// - /// 指定一个Key登记一个实例。 - /// - /// 登记使用的名称 - /// 实例对象 - /// 是否注册成功 - /// bool RegisterInstance(string key, object instance); + /// 接口类型 + /// 实例类型 + /// + ISereinIOC Register() where TImplementation : TService; /// /// 获取类型的实例。如果需要获取的类型以“接口-实现类”的方式注册,请使用接口的类型。 /// object Get(Type type); + /// /// 获取类型的实例。如果需要获取的类型以“接口-实现类”的方式注册,请使用接口的类型。 /// T Get(); /// - /// 获取指定名称的实例。 - /// 正常情况下应该使用 Get(Type type) / T Get<T>() 进行获取,但如果需要的实例是以CustomRegisterInstance()进行的登记,则需要通过这种方法进行获取。 - /// - /// - /// 登记实例时使用的Key - /// - /// T Get(string key); - - - - /// - /// 创建实例并注入依赖项,不会注册到IOC容器中。 - /// 使用场景:例如 View 的构造函数中需要创建 ViewModel,而 ViewModel 存在注册过的依赖项,可以通过该接口进行创建 + /// 给定一个类型,由IOC容器负责创建实例,如果存在多个构造函数,将由参数最多的构造函数开始尝试创建。 /// /// - object Instantiate(Type type); + object CreateTempObject(Type type); /// - /// 创建实例并注入依赖项,不会注册到IOC容器中。 - /// 使用场景:例如 View 的构造函数中需要创建 ViewModel,而 ViewModel 存在注册过的依赖项,可以通过该接口进行创建 + /// 给定一个类型,由IOC容器负责创建实例,如果存在多个构造函数,将由参数最多的构造函数开始尝试创建。 /// /// - T Instantiate(); + T CreateTempObject(); /// - /// 通过已注册的类型,生成依赖关系,然后依次实例化并注入依赖项,最后登记到容器中。 + /// 搜寻已注册的类型生成依赖关系,依次实例化并注入依赖项,缓存在由IOC容器维护的Map中,直到手动调用Reset()方法。 /// /// ISereinIOC Build(); - - /// - /// 从容器中获取某个类型的实例进行运行 - /// - /// - /// - /// - ISereinIOC Run(Action action); - ISereinIOC Run(Action action); - ISereinIOC Run(Action action); - ISereinIOC Run(Action action); - ISereinIOC Run(Action action); - ISereinIOC Run(Action action); - ISereinIOC Run(Action action); - ISereinIOC Run(Action action); } } diff --git a/Library/FlowNode/ParameterDetails.cs b/Library/FlowNode/ParameterDetails.cs index 908b5d0..097ae0d 100644 --- a/Library/FlowNode/ParameterDetails.cs +++ b/Library/FlowNode/ParameterDetails.cs @@ -246,7 +246,7 @@ namespace Serein.Library var type = EnumHelper.GetBoundValue(ExplicitType, resultEnum, attr => attr.Value); if (type is Type enumBindType && !(enumBindType is null)) { - var value = nodeModel.Env.IOC.Instantiate(enumBindType); + var value = nodeModel.Env.IOC.CreateTempObject(enumBindType); return value; } } diff --git a/Library/Network/Http/Router.cs b/Library/Network/Http/Router.cs index 1d74a97..6538203 100644 --- a/Library/Network/Http/Router.cs +++ b/Library/Network/Http/Router.cs @@ -145,7 +145,7 @@ namespace Serein.Library.Web return false; // 没有对应的处理配置 } - ControllerBase controllerInstance = (ControllerBase)SereinIOC.Instantiate(controllerType); + ControllerBase controllerInstance = (ControllerBase)SereinIOC.CreateTempObject(controllerType); if (controllerInstance is null) { diff --git a/Library/Network/WebSocket/Handle/Attribute.cs b/Library/Network/WebSocket/Handle/Attribute.cs index 9dc1ae5..051898f 100644 --- a/Library/Network/WebSocket/Handle/Attribute.cs +++ b/Library/Network/WebSocket/Handle/Attribute.cs @@ -15,56 +15,6 @@ namespace Serein.Library.Network.WebSocketCommunication.Handle { } - /// - /// 消息ID生成器 - /// - public class MsgIdHelper - { - private static readonly long _epoch = new DateTime(2023, 1, 1).Ticks; // 自定义起始时间 - private static long _lastTimestamp = -1L; // 上一次生成 ID 的时间戳 - private static long _sequence = 0L; // 序列号 - - /// - /// 获取新的ID - /// - public static long NewId => GenerateId(); - - - /// - /// 生成消息ID - /// - /// - public static long GenerateId() - { - long timestamp = DateTime.UtcNow.Ticks; - - // 如果时间戳是一样的,递增序列号 - if (timestamp == _lastTimestamp) - { - // 使用原子操作增加序列号 - _sequence = Interlocked.Increment(ref _sequence); - if (_sequence > 999999) // 序列号最大值,6位 - { - // 等待下一毫秒 - while (timestamp <= _lastTimestamp) - { - timestamp = DateTime.UtcNow.Ticks; - } - } - } - else - { - _sequence = 0; // 重置序列号 - } - - _lastTimestamp = timestamp; - - // 生成 ID:时间戳和序列号拼接 - return (timestamp - _epoch) * 1000 + _sequence; // 返回 ID - } - } - - } diff --git a/Library/Utils/MsgIdHelper.cs b/Library/Utils/MsgIdHelper.cs new file mode 100644 index 0000000..afd6a80 --- /dev/null +++ b/Library/Utils/MsgIdHelper.cs @@ -0,0 +1,58 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Serein.Library.Utils +{ + /// + /// 消息ID生成器 + /// + public class MsgIdHelper + { + private static readonly long _epoch = new DateTime(2023, 1, 1).Ticks; // 自定义起始时间 + private static long _lastTimestamp = -1L; // 上一次生成 ID 的时间戳 + private static long _sequence = 0L; // 序列号 + + /// + /// 获取新的ID + /// + public static long NewId => GenerateId(); + + + /// + /// 生成消息ID + /// + /// + public static long GenerateId() + { + long timestamp = DateTime.UtcNow.Ticks; + + // 如果时间戳是一样的,递增序列号 + if (timestamp == _lastTimestamp) + { + // 使用原子操作增加序列号 + _sequence = Interlocked.Increment(ref _sequence); + if (_sequence > 999999) // 序列号最大值,6位 + { + // 等待下一毫秒 + while (timestamp <= _lastTimestamp) + { + timestamp = DateTime.UtcNow.Ticks; + } + } + } + else + { + _sequence = 0; // 重置序列号 + } + + _lastTimestamp = timestamp; + + // 生成 ID:时间戳和序列号拼接 + return (timestamp - _epoch) * 1000 + _sequence; // 返回 ID + } + } +} diff --git a/Library/Utils/SereinIoc.cs b/Library/Utils/SereinIoc.cs index f0b2ce8..c9a2c83 100644 --- a/Library/Utils/SereinIoc.cs +++ b/Library/Utils/SereinIoc.cs @@ -1,4 +1,5 @@ -using Serein.Library.Api; +using Microsoft.CodeAnalysis.CSharp.Syntax; +using Serein.Library.Api; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -13,10 +14,8 @@ namespace Serein.Library.Utils /// /// IOC管理容器 /// - public class SereinIOC/* : ISereinIOC*/ + public class SereinIOC : ISereinIOC { - - /// /// 类型集合,暂放待实例化的类型,完成实例化之后移除 /// @@ -26,7 +25,11 @@ namespace Serein.Library.Utils /// 已完成注入的实例集合 /// private readonly ConcurrentDictionary _dependencies; - private readonly ConcurrentDictionary _registerParameterss; + + /// + /// 能够获取类型实例的闭包 + /// + private readonly ConcurrentDictionary> _registerCallback; /// /// 未完成注入的实例集合。 @@ -35,107 +38,147 @@ namespace Serein.Library.Utils /// private readonly ConcurrentDictionary> _unfinishedDependencies; + /// + /// IOC容器成功创建了类型 + /// public event IOCMembersChangedHandler OnIOCMembersChanged; + /// + /// 一个轻量级的IOC容器 + /// public SereinIOC() { _dependencies = new ConcurrentDictionary(); - _registerParameterss = new ConcurrentDictionary(); + _registerCallback = new ConcurrentDictionary>(); _typeMappings = new ConcurrentDictionary(); - _unfinishedDependencies = new ConcurrentDictionary>(); } - - #region 类型的注册 + /// + /// 向容器注册类型 + /// + /// 需要注册的类型 + /// + public ISereinIOC Register(Type type) + { + RegisterType(type.FullName, type); + return this; + } /// - /// 注册类型 + /// 向容器注册类型,并指定其实例成员 /// - /// 目标类型 - /// 参数 - public bool Register(Type type, params object[] parameters) + /// 需要注册的类型 + /// 获取实例的回调函数 + /// + public ISereinIOC Register(Type type, Func getInstance) { - return RegisterType(type?.FullName, type, parameters); + RegisterType(type.FullName, type, getInstance); + return this; } + + /// - /// 注册类型 + /// 向容器注册类型,并指定其实例成员 /// - /// 目标类型 - /// 参数 - public bool Register(params object[] parameters) + /// 需要注册的类型 + /// 获取实例的回调函数 + /// + public ISereinIOC Register(Func getInstance) { var type = typeof(T); - return RegisterType(type.FullName, type, parameters); + RegisterType(type.FullName, type, () => getInstance.Invoke()); + return this; + } + + + /// + /// 向容器注册接口类型,并指定其实例成员 + /// + /// 接口类型 + /// 实现类类型 + /// 获取实例的方法 + /// + public ISereinIOC Register(Func getInstance) + where TImplementation : TService + { + RegisterType(typeof(TService).FullName, typeof(TImplementation), () => getInstance.Invoke()); + return this; } /// - /// 注册接口类型 + /// 向容器注册接口类型,其实例成员由容器自动创建 /// - /// 目标类型 - /// 参数 - public bool Register(params object[] parameters) + /// 接口类型 + /// 实现类类型 + /// + public ISereinIOC Register() where TImplementation : TService { - return RegisterType(typeof(TService).FullName, typeof(TImplementation), parameters); + RegisterType(typeof(TService).FullName, typeof(TImplementation)); + return this; } + + #endregion + #region 示例的获取 /// /// 用于临时实例的创建,不登记到IOC容器中,依赖项注入失败时也不记录。 /// /// /// - public object Instantiate(Type type) + public object CreateTempObject(Type type) { - var constructor = type.GetConstructors().First(); // 获取第一个构造函数 - var parameters = constructor.GetParameters(); // 获取参数列表 - var parameterValues = parameters.Select(param => ResolveDependency(param.ParameterType)).ToArray(); // 生成创建类型的入参参数 - var instance = Activator.CreateInstance(type, parameterValues); // 创建实例 - if (instance != null) + var ctors = GetConstructor(type); // 获取构造函数 + object instance = null; + // 从入参最多的构造函数开始构建对象 + foreach (var ctor in ctors) { + + var parameters = ctor.GetParameters(); // 获取构造函数参数列表 + var parametersNames = parameters.Select(p => $"{p.ParameterType} {p.Name}"); + var parametersName = string.Join(", ", parametersNames); + try + { + var parameterValues = parameters.Select(param => Get(param.ParameterType)).ToArray(); // 生成创建类型的入参参数 + instance = Activator.CreateInstance(type, parameterValues); // 创建实例 + } + catch (Exception ex) + { + Debug.WriteLine(ex); + SereinEnv.WriteLine(InfoType.INFO, $"在【{type}】类型上使用ctor({parametersName})构造函数时创建对象失败。错误信息:{ex.Message}"); + continue; + } InjectDependencies(instance, false); // 完成创建后注入实例需要的特性依赖项 + break; + } + if (instance == null) + { + throw new Exception($"无法为【{type}】类型创建实例"); } return instance; } - public T Instantiate() + /// + /// 用于临时实例的创建,不登记到IOC容器中,依赖项注入失败时也不记录。 + /// + /// + /// + public T CreateTempObject() { - return (T)Instantiate(typeof(T)); - } + return (T)CreateTempObject(typeof(T)); + } + #endregion + #region 通过名称记录或获取一个实例 /// - /// 指定key值注册一个已经实例化的实例对象,并持久化储存 + /// 尝试获取指定类型的示例 /// - /// - /// - public bool RegisterInstance(string key, object instance) - { - return RegisterPersistennceInstance(key, instance); - } - /// - /// 指定key值注册一个已经实例化的实例对象,并持久化储存 - /// - /// - /// - public bool RegisterPersistennceInstance(string key, object instance) - { - // 不存在时才允许创建 - if (_dependencies.ContainsKey(key)) - { - return false; - } - _dependencies.TryAdd(key, instance); - //if (needInjectProperty) - //{ - // InjectDependencies(instance); // 注入实例需要的依赖项 - //} - //InjectUnfinishedDependencies(key, instance); // 检查是否存在其它实例需要该类型 - OnIOCMembersChanged?.Invoke(new IOCMembersChangedEventArgs(key, instance)); - return true; - } + /// + /// public object Get(Type type) { var instance = Get(type.FullName); @@ -147,14 +190,15 @@ namespace Serein.Library.Utils return Get(type.FullName); } + /// + /// 尝试获取指定类型的示例 + /// + /// + /// public T Get() { return (T)Get(typeof(T).FullName); } - public T Get(string name) - { - return (T)Get(name); - } private object Get(string name) { if (!_dependencies.TryGetValue(name, out object value)) @@ -172,7 +216,7 @@ namespace Serein.Library.Utils /// 清空容器对象 /// /// - public bool Reset() + public ISereinIOC Reset() { // 检查是否存在非托管资源 foreach (var instancei in _dependencies.Values) @@ -182,13 +226,14 @@ namespace Serein.Library.Utils disposable?.Dispose(); } } - _registerParameterss?.Clear(); + _registerCallback?.Clear(); _unfinishedDependencies?.Clear(); _typeMappings?.Clear(); _dependencies?.Clear(); - return true; + return this; } - public class TypeKeyValue + + class TypeKeyValue { public TypeKeyValue(string name, Type type) { @@ -198,19 +243,19 @@ namespace Serein.Library.Utils public string Name { get; set; } public Type Type { get; set; } } - private const string FlowBaseClassName = "@FlowBaseClass"; + private const string FlowBaseClassName = "@LibraryRootNode"; - - public Dictionary> BuildDependencyTree() + /// + /// 构建依赖关系树 + /// + /// + private Dictionary> BuildDependencyTree() { var dependencyMap = new Dictionary>(); dependencyMap[FlowBaseClassName] = new HashSet(); foreach (var typeMapping in _typeMappings) { - //var constructor = GetConstructorWithMostParameters(typeMapping.Value); // 获取参数最多的构造函数 - - var constructors = GetConstructor(typeMapping.Value); // 获取参数最多的构造函数 - + var constructors = GetConstructor(typeMapping.Value); // 获取构造函数 foreach (var constructor in constructors) { if (constructor != null) @@ -254,22 +299,22 @@ namespace Serein.Library.Utils var tmp = dependencyMap.ToDictionary(key => key.Key, value => value.Value.ToList()); return tmp; } - // 获取参数最多的构造函数 - private ConstructorInfo GetConstructorWithMostParameters(Type type) - { - return type.GetConstructors() - .OrderByDescending(c => c.GetParameters().Length) - .FirstOrDefault(); - } - // 获取所有构造函数 + + /// + /// 获取类型的获取所有构造函数 + /// + /// + /// private ConstructorInfo[] GetConstructor(Type type) { - return type.GetConstructors() - //.OrderByDescending(c => c.GetParameters().Length) - .OrderByDescending(ctor => ctor.GetParameters().Length).ToArray(); + return type.GetConstructors().OrderByDescending(ctor => ctor.GetParameters().Length).ToArray(); } - // 生成顺序 + /// + /// 创建示例的生成顺序 + /// + /// + /// public List GetCreationOrder(Dictionary> dependencyMap) { var graph = new Dictionary>(); @@ -338,19 +383,24 @@ namespace Serein.Library.Utils return creationOrder; } - public object CreateInstance(string typeName) + /// + /// 创建实例对象 + /// + /// + /// + private object CreateInstance(string typeName) { - if (!_typeMappings.TryGetValue(typeName, out var type)) + if (!_typeMappings.TryGetValue(typeName, out var type)) // 获取类型 { return null; } - if (_dependencies.TryGetValue(typeName, out var instance)) + if (_dependencies.TryGetValue(typeName, out var instance)) // 获取实例 { return instance; } - if (_registerParameterss.TryGetValue(typeName,out var @params)) + if (_registerCallback.TryGetValue(typeName,out var obj)) { - instance = Activator.CreateInstance(type, @params); + instance = obj; } // 字符串、值类型,抽象类型,暂时不支持自动创建 @@ -410,8 +460,11 @@ namespace Serein.Library.Utils return instance; } - - public bool Build() + /// + /// 绑定所有类型,生成示例 + /// + /// + public ISereinIOC Build() { var dependencyTree = BuildDependencyTree(); var creationOrder = GetCreationOrder(dependencyTree); @@ -435,29 +488,29 @@ namespace Serein.Library.Utils OnIOCMembersChanged.Invoke(new IOCMembersChangedEventArgs(typeName, value)); } _typeMappings.Clear(); - return true; + return this; } - + #endregion #region 私有方法 - /// /// 注册类型 /// - /// - /// - private bool RegisterType(string typeFull, Type type, params object[] parameters) + /// 类型名称 + /// 要注册的类型 + /// 获取实例的闭包 + private bool RegisterType(string typeFull, Type type, Func getInstance = null) { if (!_typeMappings.ContainsKey(typeFull)) { _typeMappings[typeFull] = type; - if(parameters.Length > 0) + if(getInstance != null) { - _registerParameterss[typeFull] = parameters; + _registerCallback[typeFull] = getInstance; } return true; } @@ -467,20 +520,11 @@ namespace Serein.Library.Utils } } - private object ResolveDependency(Type parameterType) - { - var obj = Get(parameterType); - if (obj is null) - { - throw new InvalidOperationException($"构造函数注入时类型[{parameterType}]不存在实例"); - } - return obj; - } /// /// 如果其它实例想要该对象时,注入过去 /// - private void InjectUnfinishedDependencies(string key,object instance) + private void InjectUnfinishedDependencies(string key, object instance) { if (_unfinishedDependencies.TryGetValue(key, out var unfinishedPropertyList)) { @@ -534,14 +578,13 @@ namespace Serein.Library.Utils } - public void Run(Action action) + private void Run(Action action) { var service = Get(); action(service); - } - public void Run(Action action) + private void Run(Action action) { var service1 = Get(); var service2 = Get(); @@ -549,7 +592,7 @@ namespace Serein.Library.Utils action(service1, service2); } - public void Run(Action action) + private void Run(Action action) { var service1 = Get(); var service2 = Get(); @@ -557,7 +600,7 @@ namespace Serein.Library.Utils action(service1, service2, service3); } - public void Run(Action action) + private void Run(Action action) { var service1 = Get(); var service2 = Get(); @@ -566,7 +609,7 @@ namespace Serein.Library.Utils action(service1, service2, service3, service4); } - public void Run(Action action) + private void Run(Action action) { var service1 = Get(); var service2 = Get(); @@ -576,7 +619,7 @@ namespace Serein.Library.Utils action(service1, service2, service3, service4, service5); } - public void Run(Action action) + private void Run(Action action) { var service1 = Get(); var service2 = Get(); @@ -587,7 +630,7 @@ namespace Serein.Library.Utils action(service1, service2, service3, service4, service5, service6); } - public void Run(Action action) + private void Run(Action action) { var service1 = Get(); var service2 = Get(); @@ -599,7 +642,7 @@ namespace Serein.Library.Utils action(service1, service2, service3, service4, service5, service6, service7); } - public void Run(Action action) + private void Run(Action action) { var service1 = Get(); var service2 = Get(); diff --git a/Net462DllTest/View/FromWorkBenchView.cs b/Net462DllTest/View/FromWorkBenchView.cs index 1b84930..60a51c5 100644 --- a/Net462DllTest/View/FromWorkBenchView.cs +++ b/Net462DllTest/View/FromWorkBenchView.cs @@ -21,7 +21,7 @@ namespace Net462DllTest if (ViewModel is null) { SereinEnv.WriteLine(InfoType.INFO, "创建对象并注入依赖项"); - ViewModel = env.IOC.Instantiate(); + ViewModel = env.IOC.CreateTempObject(); } BindData(); } diff --git a/NodeFlow/Env/FlowEnvironment.cs b/NodeFlow/Env/FlowEnvironment.cs index 493953f..7627dd9 100644 --- a/NodeFlow/Env/FlowEnvironment.cs +++ b/NodeFlow/Env/FlowEnvironment.cs @@ -64,9 +64,9 @@ namespace Serein.NodeFlow.Env #endregion #region 注册基本服务类 - PersistennceInstance.Add(typeof(FlowInterruptTool).FullName, new FlowInterruptTool()); // 缓存流程实例 - PersistennceInstance.Add(typeof(IFlowEnvironment).FullName, (FlowEnvironment)this); // 缓存流程实例 - PersistennceInstance.Add(typeof(ISereinIOC).FullName, this); // 缓存容器服务 + PersistennceInstance.Add(typeof(FlowInterruptTool), new FlowInterruptTool()); // 缓存流程实例 + PersistennceInstance.Add(typeof(IFlowEnvironment), (FlowEnvironment)this); // 缓存流程实例 + PersistennceInstance.Add(typeof(ISereinIOC), this); // 缓存容器服务 ReRegisterPersistennceInstance(); @@ -293,7 +293,7 @@ namespace Serein.NodeFlow.Env /// /// 本地运行环境缓存的持久化实例 /// - private Dictionary PersistennceInstance { get; } = new Dictionary(); + private Dictionary PersistennceInstance { get; } = new Dictionary(); /// /// 环境加载的节点集合 @@ -1428,13 +1428,13 @@ namespace Serein.NodeFlow.Env /// public void SetUIContextOperation(UIContextOperation uiContextOperation) { - this.UIContextOperation = uiContextOperation; - var fullName = typeof(UIContextOperation).FullName; - if (!string.IsNullOrEmpty(fullName)) + if(uiContextOperation is not null) { - PersistennceInstance[fullName] = uiContextOperation; // 缓存封装好的UI线程上下文 - + this.UIContextOperation = uiContextOperation; + PersistennceInstance[typeof(UIContextOperation)] = uiContextOperation; // 缓存封装好的UI线程上下文 } + + } @@ -2150,7 +2150,7 @@ namespace Serein.NodeFlow.Env { foreach (var kvp in PersistennceInstance) { - IOC.RegisterPersistennceInstance(kvp.Key, kvp.Value); + IOC.Register(kvp.Key, () => kvp.Value); } } } @@ -2182,21 +2182,32 @@ namespace Serein.NodeFlow.Env return this; } - ISereinIOC ISereinIOC.Register(Type type, params object[] parameters) + ISereinIOC ISereinIOC.Register(Type type) { - sereinIOC.Register(type, parameters); + sereinIOC.Register(type); + return this; + } + ISereinIOC ISereinIOC.Register(Type type, Func getInstance) + { + sereinIOC.Register(type, getInstance); return this; } - ISereinIOC ISereinIOC.Register(params object[] parameters) + ISereinIOC ISereinIOC.Register(Func getInstance) { - sereinIOC.Register(parameters); + sereinIOC.Register(getInstance); return this; } - ISereinIOC ISereinIOC.Register(params object[] parameters) + ISereinIOC ISereinIOC.Register() { - sereinIOC.Register(parameters); + sereinIOC.Register(); + return this; + } + + ISereinIOC ISereinIOC.Register(Func getInstance) + { + sereinIOC.Register(getInstance); return this; } @@ -2226,11 +2237,6 @@ namespace Serein.NodeFlow.Env //} - bool ISereinIOC.RegisterPersistennceInstance(string key, object instance) - { - PersistennceInstance.TryAdd(key, instance); // 记录需要持久化的实例 - return sereinIOC.RegisterPersistennceInstance(key, instance); - } //bool ISereinIOC.RegisterInstance(string key, object instance) //{ @@ -2238,13 +2244,13 @@ namespace Serein.NodeFlow.Env //} - object ISereinIOC.Instantiate(Type type) + object ISereinIOC.CreateTempObject(Type type) { - return sereinIOC.Instantiate(type); + return sereinIOC.CreateTempObject(type); } - T ISereinIOC.Instantiate() + T ISereinIOC.CreateTempObject() { - return sereinIOC.Instantiate(); + return sereinIOC.CreateTempObject(); } ISereinIOC ISereinIOC.Build() { @@ -2252,53 +2258,7 @@ namespace Serein.NodeFlow.Env return this; } - ISereinIOC ISereinIOC.Run(Action action) - { - sereinIOC.Run(action); - return this; - } - - ISereinIOC ISereinIOC.Run(Action action) - { - sereinIOC.Run(action); - return this; - } - - ISereinIOC ISereinIOC.Run(Action action) - { - sereinIOC.Run(action); - return this; - } - - ISereinIOC ISereinIOC.Run(Action action) - { - sereinIOC.Run(action); - return this; - } - - ISereinIOC ISereinIOC.Run(Action action) - { - sereinIOC.Run(action); - return this; - } - - ISereinIOC ISereinIOC.Run(Action action) - { - sereinIOC.Run(action); - return this; - } - - ISereinIOC ISereinIOC.Run(Action action) - { - sereinIOC.Run(action); - return this; - } - - ISereinIOC ISereinIOC.Run(Action action) - { - sereinIOC.Run(action); - return this; - } + #endregion diff --git a/NodeFlow/Env/FlowEnvironmentDecorator.cs b/NodeFlow/Env/FlowEnvironmentDecorator.cs index b73c78c..a583539 100644 --- a/NodeFlow/Env/FlowEnvironmentDecorator.cs +++ b/NodeFlow/Env/FlowEnvironmentDecorator.cs @@ -642,11 +642,6 @@ namespace Serein.NodeFlow.Env return IOC.Build(); } - public bool RegisterPersistennceInstance(string key, object instance) - { - return IOC.RegisterPersistennceInstance(key, instance); - } - //public bool RegisterInstance(string key, object instance) //{ // return IOC.RegisterInstance(key, instance); @@ -667,29 +662,39 @@ namespace Serein.NodeFlow.Env // return IOC.Get(key); //} - public object Instantiate(Type type) + public object CreateTempObject(Type type) { - return IOC.Instantiate(type); + return IOC.CreateTempObject(type); } - public T Instantiate() + public T CreateTempObject() { - return IOC.Instantiate(); + return IOC.CreateTempObject(); } - public ISereinIOC Register(Type type, params object[] parameters) + public ISereinIOC Register(Type type) { - return IOC.Register(type, parameters); + return IOC.Register(type); } - public ISereinIOC Register(params object[] parameters) + public ISereinIOC Register(Type type, Func getInstance) { - return IOC.Register(parameters); + return IOC.Register(type, getInstance); } - public ISereinIOC Register(params object[] parameters) where TImplementation : TService + public ISereinIOC Register(Func getInstance) { - return IOC.Register(parameters); + return IOC.Register(getInstance); + } + + public ISereinIOC Register(Func getInstance) where TImplementation : TService + { + return IOC.Register(getInstance); + } + + public ISereinIOC Register() where TImplementation : TService + { + return IOC.Register(); } public ISereinIOC Reset() @@ -697,47 +702,6 @@ namespace Serein.NodeFlow.Env return IOC.Reset(); } - public ISereinIOC Run(Action action) - { - return IOC.Run(action); - } - - public ISereinIOC Run(Action action) - { - return IOC.Run(action); - } - - public ISereinIOC Run(Action action) - { - return IOC.Run(action); - } - - public ISereinIOC Run(Action action) - { - return IOC.Run(action); - } - - public ISereinIOC Run(Action action) - { - return IOC.Run(action); - } - - public ISereinIOC Run(Action action) - { - return IOC.Run(action); - } - - public ISereinIOC Run(Action action) - { - return IOC.Run(action); - } - - public ISereinIOC Run(Action action) - { - return IOC.Run(action); - } - - #endregion diff --git a/NodeFlow/FlowWorkManagement.cs b/NodeFlow/FlowWorkManagement.cs index 0ca7dce..c2ca0b2 100644 --- a/NodeFlow/FlowWorkManagement.cs +++ b/NodeFlow/FlowWorkManagement.cs @@ -201,7 +201,8 @@ namespace Serein.NodeFlow var pool = WorkOptions.FlowContextPool; var ioc = WorkOptions.Environment.IOC; - ioc.Run(fit => fit.CancelAllTrigger());// 取消所有中断 + var fit = ioc.Get(); + fit.CancelAllTrigger(); // 取消所有中断 foreach (var md in mds) // 结束时 { if (!env.TryGetDelegateDetails(md.AssemblyName, md.MethodName, out var dd)) // 流程运行初始化