mirror of
https://gitee.com/langsisi_admin/serein-flow
synced 2026-04-21 23:36:35 +08:00
尝试整合分类代码文件
This commit is contained in:
@@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow
|
namespace Serein.Flow
|
||||||
{
|
{
|
||||||
public interface IDynamicFlowNode
|
public interface IDynamicFlowNode
|
||||||
{
|
{
|
||||||
@@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow
|
namespace Serein.Flow
|
||||||
{
|
{
|
||||||
|
|
||||||
public enum DynamicNodeType
|
public enum DynamicNodeType
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using DynamicDemo.Node;
|
using DynamicDemo.Node;
|
||||||
|
using Serein.Library.IOC;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -9,7 +10,7 @@ using System.Threading.Tasks;
|
|||||||
using static System.Collections.Specialized.BitVector32;
|
using static System.Collections.Specialized.BitVector32;
|
||||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow
|
namespace Serein.Flow
|
||||||
{
|
{
|
||||||
|
|
||||||
public enum FfState
|
public enum FfState
|
||||||
@@ -5,7 +5,7 @@ using System.Text;
|
|||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using static Dm.net.buffer.ByteArrayBuffer;
|
using static Dm.net.buffer.ByteArrayBuffer;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow
|
namespace Serein.Flow
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 显式参数
|
/// 显式参数
|
||||||
@@ -1,15 +1,9 @@
|
|||||||
using Serein;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.Tool;
|
||||||
using Serein.DynamicFlow.Tool;
|
using Serein.Library.Http;
|
||||||
using Serein.Web;
|
using Serein.Library.IOC;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using System;
|
|
||||||
using System.Collections.Concurrent;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace DynamicDemo.Node
|
namespace DynamicDemo.Node
|
||||||
{
|
{
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.NodeModel
|
namespace Serein.Flow.NodeModel
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
using Serein.DynamicFlow.Tool;
|
using Serein.Flow.Tool;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.NodeModel
|
namespace Serein.Flow.NodeModel
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@@ -4,7 +4,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.NodeModel
|
namespace Serein.Flow.NodeModel
|
||||||
{
|
{
|
||||||
public class CompositeLoopNode : NodeBase
|
public class CompositeLoopNode : NodeBase
|
||||||
{
|
{
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.Tool;
|
using Serein.Flow.Tool;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
using System;
|
using System;
|
||||||
@@ -8,7 +8,7 @@ using System.Threading;
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.NodeModel
|
namespace Serein.Flow.NodeModel
|
||||||
{
|
{
|
||||||
|
|
||||||
public enum ConnectionType
|
public enum ConnectionType
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
using Serein.DynamicFlow.Tool;
|
using Serein.Flow.Tool;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.NodeModel
|
namespace Serein.Flow.NodeModel
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 单动作节点(用于动作控件)
|
/// 单动作节点(用于动作控件)
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
using Serein.DynamicFlow.SerinExpression;
|
using Serein.Flow.SerinExpression;
|
||||||
using Serein.DynamicFlow.Tool;
|
using Serein.Flow.Tool;
|
||||||
using System;
|
using System;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.NodeModel
|
namespace Serein.Flow.NodeModel
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 条件节点(用于条件控件)
|
/// 条件节点(用于条件控件)
|
||||||
@@ -1,11 +1,11 @@
|
|||||||
using Serein.DynamicFlow.SerinExpression;
|
using Serein.Flow.SerinExpression;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.NodeModel
|
namespace Serein.Flow.NodeModel
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Expression Operation - 表达式操作
|
/// Expression Operation - 表达式操作
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using Serein.DynamicFlow.Tool;
|
using Serein.Flow.Tool;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.NodeModel
|
namespace Serein.Flow.NodeModel
|
||||||
{
|
{
|
||||||
|
|
||||||
public class SingleFlipflopNode : NodeBase
|
public class SingleFlipflopNode : NodeBase
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.SerinExpression
|
namespace Serein.Flow.SerinExpression
|
||||||
{
|
{
|
||||||
|
|
||||||
public abstract class ConditionResolver
|
public abstract class ConditionResolver
|
||||||
@@ -3,7 +3,7 @@ using System.Globalization;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.SerinExpression;
|
namespace Serein.Flow.SerinExpression;
|
||||||
|
|
||||||
public class SerinConditionParser
|
public class SerinConditionParser
|
||||||
{
|
{
|
||||||
@@ -4,10 +4,10 @@ using System.Data;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using static Serein.DynamicFlow.NodeModel.SingleExpOpNode;
|
using static Serein.Flow.NodeModel.SingleExpOpNode;
|
||||||
using static System.Runtime.InteropServices.JavaScript.JSType;
|
using static System.Runtime.InteropServices.JavaScript.JSType;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.SerinExpression
|
namespace Serein.Flow.SerinExpression
|
||||||
{
|
{
|
||||||
public class SerinArithmeticExpressionEvaluator
|
public class SerinArithmeticExpressionEvaluator
|
||||||
{
|
{
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
using Serein;
|
using Serein;
|
||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
|
using Serein.Library.IOC;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
@@ -9,7 +10,7 @@ using System.Linq;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.Tool;
|
namespace Serein.Flow.Tool;
|
||||||
|
|
||||||
|
|
||||||
public static class DelegateCache
|
public static class DelegateCache
|
||||||
@@ -7,7 +7,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.Tool
|
namespace Serein.Flow.Tool
|
||||||
{
|
{
|
||||||
|
|
||||||
#region 锁、tsk工具 (已注释)
|
#region 锁、tsk工具 (已注释)
|
||||||
@@ -6,7 +6,7 @@ using System.Linq.Expressions;
|
|||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.Tool
|
namespace Serein.Flow.Tool
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 对于实例创建的表达式树反射
|
/// 对于实例创建的表达式树反射
|
||||||
@@ -5,7 +5,7 @@ using System.Linq;
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.Tool
|
namespace Serein.Flow.Tool
|
||||||
{
|
{
|
||||||
public class TcsSignalException : Exception
|
public class TcsSignalException : Exception
|
||||||
{
|
{
|
||||||
@@ -1,10 +1,10 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Reflection.Metadata.Ecma335;
|
using System.Reflection.Metadata.Ecma335;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|
||||||
namespace Serein.DynamicFlow.Tool
|
namespace Serein.Flow.Tool
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
using System;
|
using System;
|
||||||
|
|
||||||
namespace Serein.Web
|
namespace Serein.Library.Http
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 表示参数为url中的数据(Get请求中不需要显式标注)
|
/// 表示参数为url中的数据(Get请求中不需要显式标注)
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
namespace Serein.Web
|
namespace Serein.Library.Http
|
||||||
{
|
{
|
||||||
public class ControllerBase
|
public class ControllerBase
|
||||||
{
|
{
|
||||||
@@ -1,8 +1,10 @@
|
|||||||
using Serein.Tool;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json;
|
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
|
using Serein.Library.IOC;
|
||||||
|
using Serein.Tool;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Reflection;
|
using System.Reflection;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
@@ -10,7 +12,7 @@ using System.Web;
|
|||||||
using Enum = System.Enum;
|
using Enum = System.Enum;
|
||||||
using Type = System.Type;
|
using Type = System.Type;
|
||||||
|
|
||||||
namespace Serein.Web
|
namespace Serein.Library.Http
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
using System.Collections.Concurrent;
|
using Serein.Library.IOC;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
using System.Net;
|
using System.Net;
|
||||||
using System.Security.AccessControl;
|
using System.Security.AccessControl;
|
||||||
|
|
||||||
namespace Serein.Web
|
namespace Serein.Library.Http
|
||||||
{
|
{
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
413
Library/IOC/ServiceContainer.cs
Normal file
413
Library/IOC/ServiceContainer.cs
Normal file
@@ -0,0 +1,413 @@
|
|||||||
|
using Serein.Library.Http;
|
||||||
|
using SqlSugar;
|
||||||
|
using System.Collections.Concurrent;
|
||||||
|
using System.Reflection;
|
||||||
|
|
||||||
|
namespace Serein.Library.IOC
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
public interface IServiceContainer
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或创建类型的实例(不注入依赖项)
|
||||||
|
/// </summary>
|
||||||
|
object GetOrCreateServiceInstance(Type serviceType, params object[] parameters);
|
||||||
|
T CreateServiceInstance<T>(params object[] parameters);
|
||||||
|
IServiceContainer Reset(); // 清空
|
||||||
|
IServiceContainer Register(Type type, params object[] parameters);
|
||||||
|
IServiceContainer Register<T>(params object[] parameters);
|
||||||
|
IServiceContainer Register<TService, TImplementation>(params object[] parameters) where TImplementation : TService;
|
||||||
|
T Get<T>();
|
||||||
|
object Get(Type type);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 创建目标类型的对象, 并注入依赖项
|
||||||
|
/// </summary>
|
||||||
|
object? Instantiate(Type type, params object[] parameters);
|
||||||
|
IServiceContainer Build();
|
||||||
|
IServiceContainer Run<T>(Action<T> action);
|
||||||
|
IServiceContainer Run<T1, T2>(Action<T1, T2> action);
|
||||||
|
IServiceContainer Run<T1, T2, T3>(Action<T1, T2, T3> action);
|
||||||
|
IServiceContainer Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action);
|
||||||
|
IServiceContainer Run<T1, T2, T3, T4, T5>(Action<T1, T2, T3, T4, T5> action);
|
||||||
|
IServiceContainer Run<T1, T2, T3, T4, T5, T6>(Action<T1, T2, T3, T4, T5, T6> action);
|
||||||
|
IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7>(Action<T1, T2, T3, T4, T5, T6, T7> action);
|
||||||
|
IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7, T8>(Action<T1, T2, T3, T4, T5, T6, T7, T8> action);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ServiceContainer : IServiceContainer
|
||||||
|
{
|
||||||
|
|
||||||
|
private readonly ConcurrentDictionary<string, object> _dependencies;
|
||||||
|
private readonly ConcurrentDictionary<string, Type> _typeMappings;
|
||||||
|
private readonly List<Type> _waitingForInstantiation;
|
||||||
|
|
||||||
|
public ServiceContainer()
|
||||||
|
{
|
||||||
|
|
||||||
|
_dependencies = new ConcurrentDictionary<string, object>
|
||||||
|
{
|
||||||
|
[typeof(IServiceContainer).FullName] = this
|
||||||
|
};
|
||||||
|
|
||||||
|
_typeMappings = new ConcurrentDictionary<string, Type>();
|
||||||
|
_waitingForInstantiation = [];
|
||||||
|
}
|
||||||
|
public object GetOrCreateServiceInstance(Type type, params object[] parameters)
|
||||||
|
{
|
||||||
|
Register(type);
|
||||||
|
object instance;
|
||||||
|
|
||||||
|
if (_dependencies.ContainsKey(type.FullName))
|
||||||
|
{
|
||||||
|
instance = _dependencies[type.FullName];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
instance = Activator.CreateInstance(type);
|
||||||
|
|
||||||
|
|
||||||
|
_dependencies[type.FullName] = instance;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return instance;
|
||||||
|
|
||||||
|
}
|
||||||
|
public T CreateServiceInstance<T>(params object[] parameters)
|
||||||
|
{
|
||||||
|
return (T)GetOrCreateServiceInstance(typeof(T), parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Reset()
|
||||||
|
{
|
||||||
|
foreach(var instancei in _dependencies.Values)
|
||||||
|
{
|
||||||
|
if (typeof(IDisposable).IsAssignableFrom(instancei.GetType()) && instancei is IDisposable disposable)
|
||||||
|
{
|
||||||
|
disposable.Dispose();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_dependencies.Clear();
|
||||||
|
_waitingForInstantiation.Clear();
|
||||||
|
//_typeMappings.Clear();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Register(Type type, params object[] parameters)
|
||||||
|
{
|
||||||
|
|
||||||
|
if (!_typeMappings.ContainsKey(type.FullName))
|
||||||
|
{
|
||||||
|
_typeMappings[type.FullName] = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
public IServiceContainer Register<T>(params object[] parameters)
|
||||||
|
{
|
||||||
|
Register(typeof(T), parameters);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Register<TService, TImplementation>(params object[] parameters)
|
||||||
|
where TImplementation : TService
|
||||||
|
{
|
||||||
|
_typeMappings[typeof(TService).FullName!] = typeof(TImplementation);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object Get(Type type)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if (!_dependencies.TryGetValue(type.FullName, out object value))
|
||||||
|
{
|
||||||
|
Register(type);
|
||||||
|
|
||||||
|
value = Instantiate(type);
|
||||||
|
|
||||||
|
InjectDependencies(type);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return value;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public T Get<T>()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
if(!_dependencies.TryGetValue(typeof(T).FullName, out object value))
|
||||||
|
{
|
||||||
|
Register<T>();
|
||||||
|
|
||||||
|
value = Instantiate(typeof(T));
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return (T)value;
|
||||||
|
|
||||||
|
|
||||||
|
//throw new InvalidOperationException("目标类型未创建实例");
|
||||||
|
}
|
||||||
|
public IServiceContainer Build()
|
||||||
|
{
|
||||||
|
foreach (var type in _typeMappings.Values)
|
||||||
|
{
|
||||||
|
|
||||||
|
if(!_dependencies.ContainsKey(type.FullName))
|
||||||
|
{
|
||||||
|
|
||||||
|
_dependencies[type.FullName] = Activator.CreateInstance(type);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach (var instance in _dependencies.Values)
|
||||||
|
{
|
||||||
|
|
||||||
|
InjectDependencies(instance); // 替换占位符
|
||||||
|
}
|
||||||
|
|
||||||
|
//var instance = Instantiate(item.Value);
|
||||||
|
|
||||||
|
TryInstantiateWaitingDependencies();
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public object? Instantiate(Type controllerType, params object[] parameters)
|
||||||
|
{
|
||||||
|
var instance = Activator.CreateInstance(controllerType, parameters);
|
||||||
|
if(instance != null)
|
||||||
|
{
|
||||||
|
InjectDependencies(instance);
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void InjectDependencies(object instance)
|
||||||
|
{
|
||||||
|
var properties = instance.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
|
||||||
|
.Where(p => p.CanWrite && p.GetCustomAttribute<AutoInjectionAttribute>() != null);
|
||||||
|
|
||||||
|
foreach (var property in properties)
|
||||||
|
{
|
||||||
|
var propertyType = property.PropertyType;
|
||||||
|
|
||||||
|
if (_dependencies.TryGetValue(propertyType.FullName, out var dependencyInstance))
|
||||||
|
{
|
||||||
|
property.SetValue(instance, dependencyInstance);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void TryInstantiateWaitingDependencies()
|
||||||
|
{
|
||||||
|
foreach (var waitingType in _waitingForInstantiation.ToList())
|
||||||
|
{
|
||||||
|
if (_typeMappings.TryGetValue(waitingType.FullName!, out var implementationType))
|
||||||
|
{
|
||||||
|
var instance = Instantiate(implementationType);
|
||||||
|
if (instance != null)
|
||||||
|
{
|
||||||
|
|
||||||
|
_dependencies[waitingType.FullName] = instance;
|
||||||
|
|
||||||
|
_waitingForInstantiation.Remove(waitingType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#region run()
|
||||||
|
public IServiceContainer Run<T>(Action<T> action)
|
||||||
|
{
|
||||||
|
var service = Get<T>();
|
||||||
|
if (service != null)
|
||||||
|
{
|
||||||
|
action(service);
|
||||||
|
}
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Run<T1, T2>(Action<T1, T2> action)
|
||||||
|
{
|
||||||
|
var service1 = Get<T1>();
|
||||||
|
var service2 = Get<T2>();
|
||||||
|
|
||||||
|
action(service1, service2);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Run<T1, T2, T3>(Action<T1, T2, T3> action)
|
||||||
|
{
|
||||||
|
var service1 = Get<T1>();
|
||||||
|
var service2 = Get<T2>();
|
||||||
|
var service3 = Get<T3>();
|
||||||
|
action(service1, service2, service3);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action)
|
||||||
|
{
|
||||||
|
var service1 = Get<T1>();
|
||||||
|
var service2 = Get<T2>();
|
||||||
|
var service3 = Get<T3>();
|
||||||
|
var service4 = Get<T4>();
|
||||||
|
action(service1, service2, service3, service4);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Run<T1, T2, T3, T4, T5>(Action<T1, T2, T3, T4, T5> action)
|
||||||
|
{
|
||||||
|
var service1 = Get<T1>();
|
||||||
|
var service2 = Get<T2>();
|
||||||
|
var service3 = Get<T3>();
|
||||||
|
var service4 = Get<T4>();
|
||||||
|
var service5 = Get<T5>();
|
||||||
|
action(service1, service2, service3, service4, service5);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Run<T1, T2, T3, T4, T5, T6>(Action<T1, T2, T3, T4, T5, T6> action)
|
||||||
|
{
|
||||||
|
var service1 = Get<T1>();
|
||||||
|
var service2 = Get<T2>();
|
||||||
|
var service3 = Get<T3>();
|
||||||
|
var service4 = Get<T4>();
|
||||||
|
var service5 = Get<T5>();
|
||||||
|
var service6 = Get<T6>();
|
||||||
|
action(service1, service2, service3, service4, service5, service6);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7>(Action<T1, T2, T3, T4, T5, T6, T7> action)
|
||||||
|
{
|
||||||
|
var service1 = Get<T1>();
|
||||||
|
var service2 = Get<T2>();
|
||||||
|
var service3 = Get<T3>();
|
||||||
|
var service4 = Get<T4>();
|
||||||
|
var service5 = Get<T5>();
|
||||||
|
var service6 = Get<T6>();
|
||||||
|
var service7 = Get<T7>();
|
||||||
|
action(service1, service2, service3, service4, service5, service6, service7);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7, T8>(Action<T1, T2, T3, T4, T5, T6, T7, T8> action)
|
||||||
|
{
|
||||||
|
var service1 = Get<T1>();
|
||||||
|
var service2 = Get<T2>();
|
||||||
|
var service3 = Get<T3>();
|
||||||
|
var service4 = Get<T4>();
|
||||||
|
var service5 = Get<T5>();
|
||||||
|
var service6 = Get<T6>();
|
||||||
|
var service7 = Get<T7>();
|
||||||
|
var service8 = Get<T8>();
|
||||||
|
action(service1, service2, service3, service4, service5, service6, service7, service8);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endregion
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* public interface IServiceContainer
|
||||||
|
{
|
||||||
|
ServiceContainer Register<T>(params object[] parameters);
|
||||||
|
ServiceContainer Register<TService, TImplementation>(params object[] parameters) where TImplementation : TService;
|
||||||
|
TService Resolve<TService>();
|
||||||
|
void Get<T>(Action<T> action);
|
||||||
|
object Instantiate(Type type, params object[] parameters);
|
||||||
|
|
||||||
|
}
|
||||||
|
public class ServiceContainer : IServiceContainer
|
||||||
|
{
|
||||||
|
private readonly Dictionary<Type, object> _dependencies;
|
||||||
|
public ServiceContainer()
|
||||||
|
{
|
||||||
|
_dependencies = new Dictionary<Type, object>
|
||||||
|
{
|
||||||
|
[typeof(IServiceContainer)] = this
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Get<T>(Action<T> action)
|
||||||
|
{
|
||||||
|
var service = Resolve<T>();
|
||||||
|
action(service);
|
||||||
|
}
|
||||||
|
public ServiceContainer Register<T>(params object[] parameters)
|
||||||
|
{
|
||||||
|
var instance = Instantiate(typeof(T), parameters);
|
||||||
|
_dependencies[typeof(T)] = instance;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ServiceContainer Register<TService, TImplementation>(params object[] parameters)
|
||||||
|
where TImplementation : TService
|
||||||
|
{
|
||||||
|
|
||||||
|
_dependencies[typeof(TService)] = Instantiate(typeof(TImplementation), parameters);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public TService Resolve<TService>()
|
||||||
|
{
|
||||||
|
return (TService)_dependencies[typeof(TService)];
|
||||||
|
}
|
||||||
|
|
||||||
|
public object Instantiate(Type controllerType, params object[] parameters)
|
||||||
|
{
|
||||||
|
var constructors = controllerType.GetConstructors(); // 获取控制器的所有构造函数
|
||||||
|
|
||||||
|
// 查找具有最多参数的构造函数
|
||||||
|
var constructor = constructors.OrderByDescending(c => c.GetParameters().Length).FirstOrDefault();
|
||||||
|
|
||||||
|
if (constructor != null)
|
||||||
|
{
|
||||||
|
if (parameters.Length > 0)
|
||||||
|
{
|
||||||
|
return Activator.CreateInstance(controllerType, parameters);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
var tmpParameters = constructor.GetParameters();
|
||||||
|
var dependencyInstances = new List<object>();
|
||||||
|
|
||||||
|
foreach (var parameter in tmpParameters)
|
||||||
|
{
|
||||||
|
var parameterType = parameter.ParameterType;
|
||||||
|
_dependencies.TryGetValue(parameterType, out var dependencyInstance);
|
||||||
|
dependencyInstances.Add(dependencyInstance);
|
||||||
|
if (dependencyInstance == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 用解析的依赖项实例化目标类型
|
||||||
|
return Activator.CreateInstance(controllerType, dependencyInstances.ToArray());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return Activator.CreateInstance(controllerType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -14,8 +14,16 @@
|
|||||||
<None Remove="obj\**" />
|
<None Remove="obj\**" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<Compile Remove="ServiceContainer.cs" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="SqlSugarCore" Version="5.1.4.166" />
|
<PackageReference Include="SqlSugarCore" Version="5.1.4.166" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\LibraryIOC\Serein.Library.IOC.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,418 +1,418 @@
|
|||||||
using Serein.Web;
|
//using Serein.Web;
|
||||||
using Microsoft.Win32;
|
//using Microsoft.Win32;
|
||||||
using NetTaste;
|
//using NetTaste;
|
||||||
using System.Collections.Concurrent;
|
//using System.Collections.Concurrent;
|
||||||
using System.Reflection;
|
//using System.Reflection;
|
||||||
using System;
|
//using System;
|
||||||
using System.Linq;
|
//using System.Linq;
|
||||||
using System.Collections.Generic;
|
//using System.Collections.Generic;
|
||||||
using SqlSugar;
|
//using SqlSugar;
|
||||||
|
|
||||||
namespace Serein
|
//namespace Serein
|
||||||
{
|
//{
|
||||||
|
|
||||||
|
|
||||||
public interface IServiceContainer
|
// public interface IServiceContainer
|
||||||
{
|
// {
|
||||||
/// <summary>
|
// /// <summary>
|
||||||
/// 获取或创建类型的实例(不注入依赖项)
|
// /// 获取或创建类型的实例(不注入依赖项)
|
||||||
/// </summary>
|
// /// </summary>
|
||||||
object GetOrCreateServiceInstance(Type serviceType, params object[] parameters);
|
// object GetOrCreateServiceInstance(Type serviceType, params object[] parameters);
|
||||||
T CreateServiceInstance<T>(params object[] parameters);
|
// T CreateServiceInstance<T>(params object[] parameters);
|
||||||
IServiceContainer Reset(); // 清空
|
// IServiceContainer Reset(); // 清空
|
||||||
IServiceContainer Register(Type type, params object[] parameters);
|
// IServiceContainer Register(Type type, params object[] parameters);
|
||||||
IServiceContainer Register<T>(params object[] parameters);
|
// IServiceContainer Register<T>(params object[] parameters);
|
||||||
IServiceContainer Register<TService, TImplementation>(params object[] parameters) where TImplementation : TService;
|
// IServiceContainer Register<TService, TImplementation>(params object[] parameters) where TImplementation : TService;
|
||||||
T Get<T>();
|
// T Get<T>();
|
||||||
object Get(Type type);
|
// object Get(Type type);
|
||||||
|
|
||||||
/// <summary>
|
// /// <summary>
|
||||||
/// 创建目标类型的对象, 并注入依赖项
|
// /// 创建目标类型的对象, 并注入依赖项
|
||||||
/// </summary>
|
// /// </summary>
|
||||||
object? Instantiate(Type type, params object[] parameters);
|
// object? Instantiate(Type type, params object[] parameters);
|
||||||
IServiceContainer Build();
|
// IServiceContainer Build();
|
||||||
IServiceContainer Run<T>(Action<T> action);
|
// IServiceContainer Run<T>(Action<T> action);
|
||||||
IServiceContainer Run<T1, T2>(Action<T1, T2> action);
|
// IServiceContainer Run<T1, T2>(Action<T1, T2> action);
|
||||||
IServiceContainer Run<T1, T2, T3>(Action<T1, T2, T3> action);
|
// IServiceContainer Run<T1, T2, T3>(Action<T1, T2, T3> action);
|
||||||
IServiceContainer Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action);
|
// IServiceContainer Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action);
|
||||||
IServiceContainer Run<T1, T2, T3, T4, T5>(Action<T1, T2, T3, T4, T5> action);
|
// IServiceContainer Run<T1, T2, T3, T4, T5>(Action<T1, T2, T3, T4, T5> action);
|
||||||
IServiceContainer Run<T1, T2, T3, T4, T5, T6>(Action<T1, T2, T3, T4, T5, T6> action);
|
// IServiceContainer Run<T1, T2, T3, T4, T5, T6>(Action<T1, T2, T3, T4, T5, T6> action);
|
||||||
IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7>(Action<T1, T2, T3, T4, T5, T6, T7> action);
|
// IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7>(Action<T1, T2, T3, T4, T5, T6, T7> action);
|
||||||
IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7, T8>(Action<T1, T2, T3, T4, T5, T6, T7, T8> action);
|
// IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7, T8>(Action<T1, T2, T3, T4, T5, T6, T7, T8> action);
|
||||||
}
|
// }
|
||||||
|
|
||||||
public class ServiceContainer : IServiceContainer
|
// public class ServiceContainer : IServiceContainer
|
||||||
{
|
// {
|
||||||
|
|
||||||
private readonly ConcurrentDictionary<string, object> _dependencies;
|
// private readonly ConcurrentDictionary<string, object> _dependencies;
|
||||||
private readonly ConcurrentDictionary<string, Type> _typeMappings;
|
// private readonly ConcurrentDictionary<string, Type> _typeMappings;
|
||||||
private readonly List<Type> _waitingForInstantiation;
|
// private readonly List<Type> _waitingForInstantiation;
|
||||||
|
|
||||||
public ServiceContainer()
|
// public ServiceContainer()
|
||||||
{
|
// {
|
||||||
|
|
||||||
_dependencies = new ConcurrentDictionary<string, object>
|
// _dependencies = new ConcurrentDictionary<string, object>
|
||||||
{
|
// {
|
||||||
[typeof(IServiceContainer).FullName] = this
|
// [typeof(IServiceContainer).FullName] = this
|
||||||
};
|
// };
|
||||||
|
|
||||||
_typeMappings = new ConcurrentDictionary<string, Type>();
|
// _typeMappings = new ConcurrentDictionary<string, Type>();
|
||||||
_waitingForInstantiation = [];
|
// _waitingForInstantiation = [];
|
||||||
}
|
// }
|
||||||
public object GetOrCreateServiceInstance(Type type, params object[] parameters)
|
// public object GetOrCreateServiceInstance(Type type, params object[] parameters)
|
||||||
{
|
// {
|
||||||
Register(type);
|
// Register(type);
|
||||||
object instance;
|
// object instance;
|
||||||
|
|
||||||
if (_dependencies.ContainsKey(type.FullName))
|
// if (_dependencies.ContainsKey(type.FullName))
|
||||||
{
|
// {
|
||||||
instance = _dependencies[type.FullName];
|
// instance = _dependencies[type.FullName];
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
|
|
||||||
instance = Activator.CreateInstance(type);
|
// instance = Activator.CreateInstance(type);
|
||||||
|
|
||||||
|
|
||||||
_dependencies[type.FullName] = instance;
|
// _dependencies[type.FullName] = instance;
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
return instance;
|
// return instance;
|
||||||
|
|
||||||
}
|
// }
|
||||||
public T CreateServiceInstance<T>(params object[] parameters)
|
// public T CreateServiceInstance<T>(params object[] parameters)
|
||||||
{
|
// {
|
||||||
return (T)GetOrCreateServiceInstance(typeof(T), parameters);
|
// return (T)GetOrCreateServiceInstance(typeof(T), parameters);
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Reset()
|
// public IServiceContainer Reset()
|
||||||
{
|
// {
|
||||||
foreach(var instancei in _dependencies.Values)
|
// foreach(var instancei in _dependencies.Values)
|
||||||
{
|
// {
|
||||||
if (typeof(IDisposable).IsAssignableFrom(instancei.GetType()) && instancei is IDisposable disposable)
|
// if (typeof(IDisposable).IsAssignableFrom(instancei.GetType()) && instancei is IDisposable disposable)
|
||||||
{
|
// {
|
||||||
disposable.Dispose();
|
// disposable.Dispose();
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
_dependencies.Clear();
|
// _dependencies.Clear();
|
||||||
_waitingForInstantiation.Clear();
|
// _waitingForInstantiation.Clear();
|
||||||
//_typeMappings.Clear();
|
// //_typeMappings.Clear();
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Register(Type type, params object[] parameters)
|
// public IServiceContainer Register(Type type, params object[] parameters)
|
||||||
{
|
// {
|
||||||
|
|
||||||
if (!_typeMappings.ContainsKey(type.FullName))
|
// if (!_typeMappings.ContainsKey(type.FullName))
|
||||||
{
|
// {
|
||||||
_typeMappings[type.FullName] = type;
|
// _typeMappings[type.FullName] = type;
|
||||||
}
|
// }
|
||||||
|
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
public IServiceContainer Register<T>(params object[] parameters)
|
// public IServiceContainer Register<T>(params object[] parameters)
|
||||||
{
|
// {
|
||||||
Register(typeof(T), parameters);
|
// Register(typeof(T), parameters);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Register<TService, TImplementation>(params object[] parameters)
|
// public IServiceContainer Register<TService, TImplementation>(params object[] parameters)
|
||||||
where TImplementation : TService
|
// where TImplementation : TService
|
||||||
{
|
// {
|
||||||
_typeMappings[typeof(TService).FullName!] = typeof(TImplementation);
|
// _typeMappings[typeof(TService).FullName!] = typeof(TImplementation);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public object Get(Type type)
|
// public object Get(Type type)
|
||||||
{
|
// {
|
||||||
|
|
||||||
|
|
||||||
if (!_dependencies.TryGetValue(type.FullName, out object value))
|
// if (!_dependencies.TryGetValue(type.FullName, out object value))
|
||||||
{
|
// {
|
||||||
Register(type);
|
// Register(type);
|
||||||
|
|
||||||
value = Instantiate(type);
|
// value = Instantiate(type);
|
||||||
|
|
||||||
InjectDependencies(type);
|
// InjectDependencies(type);
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return value;
|
// return value;
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
public T Get<T>()
|
// public T Get<T>()
|
||||||
{
|
// {
|
||||||
|
|
||||||
|
|
||||||
if(!_dependencies.TryGetValue(typeof(T).FullName, out object value))
|
// if(!_dependencies.TryGetValue(typeof(T).FullName, out object value))
|
||||||
{
|
// {
|
||||||
Register<T>();
|
// Register<T>();
|
||||||
|
|
||||||
value = Instantiate(typeof(T));
|
// value = Instantiate(typeof(T));
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
return (T)value;
|
// return (T)value;
|
||||||
|
|
||||||
|
|
||||||
//throw new InvalidOperationException("目标类型未创建实例");
|
// //throw new InvalidOperationException("目标类型未创建实例");
|
||||||
}
|
// }
|
||||||
public IServiceContainer Build()
|
// public IServiceContainer Build()
|
||||||
{
|
// {
|
||||||
foreach (var type in _typeMappings.Values)
|
// foreach (var type in _typeMappings.Values)
|
||||||
{
|
// {
|
||||||
|
|
||||||
if(!_dependencies.ContainsKey(type.FullName))
|
// if(!_dependencies.ContainsKey(type.FullName))
|
||||||
{
|
// {
|
||||||
|
|
||||||
_dependencies[type.FullName] = Activator.CreateInstance(type);
|
// _dependencies[type.FullName] = Activator.CreateInstance(type);
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
// }
|
||||||
|
|
||||||
foreach (var instance in _dependencies.Values)
|
// foreach (var instance in _dependencies.Values)
|
||||||
{
|
// {
|
||||||
|
|
||||||
InjectDependencies(instance); // 替换占位符
|
// InjectDependencies(instance); // 替换占位符
|
||||||
}
|
// }
|
||||||
|
|
||||||
//var instance = Instantiate(item.Value);
|
// //var instance = Instantiate(item.Value);
|
||||||
|
|
||||||
TryInstantiateWaitingDependencies();
|
// TryInstantiateWaitingDependencies();
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public object? Instantiate(Type controllerType, params object[] parameters)
|
// public object? Instantiate(Type controllerType, params object[] parameters)
|
||||||
{
|
// {
|
||||||
var instance = Activator.CreateInstance(controllerType, parameters);
|
// var instance = Activator.CreateInstance(controllerType, parameters);
|
||||||
if(instance != null)
|
// if(instance != null)
|
||||||
{
|
// {
|
||||||
InjectDependencies(instance);
|
// InjectDependencies(instance);
|
||||||
}
|
// }
|
||||||
return instance;
|
// return instance;
|
||||||
}
|
// }
|
||||||
|
|
||||||
private void InjectDependencies(object instance)
|
// private void InjectDependencies(object instance)
|
||||||
{
|
// {
|
||||||
var properties = instance.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
|
// var properties = instance.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public)
|
||||||
.Where(p => p.CanWrite && p.GetCustomAttribute<AutoInjectionAttribute>() != null);
|
// .Where(p => p.CanWrite && p.GetCustomAttribute<AutoInjectionAttribute>() != null);
|
||||||
|
|
||||||
foreach (var property in properties)
|
// foreach (var property in properties)
|
||||||
{
|
// {
|
||||||
var propertyType = property.PropertyType;
|
// var propertyType = property.PropertyType;
|
||||||
|
|
||||||
if (_dependencies.TryGetValue(propertyType.FullName, out var dependencyInstance))
|
// if (_dependencies.TryGetValue(propertyType.FullName, out var dependencyInstance))
|
||||||
{
|
// {
|
||||||
property.SetValue(instance, dependencyInstance);
|
// property.SetValue(instance, dependencyInstance);
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
private void TryInstantiateWaitingDependencies()
|
// private void TryInstantiateWaitingDependencies()
|
||||||
{
|
// {
|
||||||
foreach (var waitingType in _waitingForInstantiation.ToList())
|
// foreach (var waitingType in _waitingForInstantiation.ToList())
|
||||||
{
|
// {
|
||||||
if (_typeMappings.TryGetValue(waitingType.FullName!, out var implementationType))
|
// if (_typeMappings.TryGetValue(waitingType.FullName!, out var implementationType))
|
||||||
{
|
// {
|
||||||
var instance = Instantiate(implementationType);
|
// var instance = Instantiate(implementationType);
|
||||||
if (instance != null)
|
// if (instance != null)
|
||||||
{
|
// {
|
||||||
|
|
||||||
_dependencies[waitingType.FullName] = instance;
|
// _dependencies[waitingType.FullName] = instance;
|
||||||
|
|
||||||
_waitingForInstantiation.Remove(waitingType);
|
// _waitingForInstantiation.Remove(waitingType);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
#region run()
|
// #region run()
|
||||||
public IServiceContainer Run<T>(Action<T> action)
|
// public IServiceContainer Run<T>(Action<T> action)
|
||||||
{
|
// {
|
||||||
var service = Get<T>();
|
// var service = Get<T>();
|
||||||
if (service != null)
|
// if (service != null)
|
||||||
{
|
// {
|
||||||
action(service);
|
// action(service);
|
||||||
}
|
// }
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Run<T1, T2>(Action<T1, T2> action)
|
// public IServiceContainer Run<T1, T2>(Action<T1, T2> action)
|
||||||
{
|
// {
|
||||||
var service1 = Get<T1>();
|
// var service1 = Get<T1>();
|
||||||
var service2 = Get<T2>();
|
// var service2 = Get<T2>();
|
||||||
|
|
||||||
action(service1, service2);
|
// action(service1, service2);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Run<T1, T2, T3>(Action<T1, T2, T3> action)
|
// public IServiceContainer Run<T1, T2, T3>(Action<T1, T2, T3> action)
|
||||||
{
|
// {
|
||||||
var service1 = Get<T1>();
|
// var service1 = Get<T1>();
|
||||||
var service2 = Get<T2>();
|
// var service2 = Get<T2>();
|
||||||
var service3 = Get<T3>();
|
// var service3 = Get<T3>();
|
||||||
action(service1, service2, service3);
|
// action(service1, service2, service3);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action)
|
// public IServiceContainer Run<T1, T2, T3, T4>(Action<T1, T2, T3, T4> action)
|
||||||
{
|
// {
|
||||||
var service1 = Get<T1>();
|
// var service1 = Get<T1>();
|
||||||
var service2 = Get<T2>();
|
// var service2 = Get<T2>();
|
||||||
var service3 = Get<T3>();
|
// var service3 = Get<T3>();
|
||||||
var service4 = Get<T4>();
|
// var service4 = Get<T4>();
|
||||||
action(service1, service2, service3, service4);
|
// action(service1, service2, service3, service4);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Run<T1, T2, T3, T4, T5>(Action<T1, T2, T3, T4, T5> action)
|
// public IServiceContainer Run<T1, T2, T3, T4, T5>(Action<T1, T2, T3, T4, T5> action)
|
||||||
{
|
// {
|
||||||
var service1 = Get<T1>();
|
// var service1 = Get<T1>();
|
||||||
var service2 = Get<T2>();
|
// var service2 = Get<T2>();
|
||||||
var service3 = Get<T3>();
|
// var service3 = Get<T3>();
|
||||||
var service4 = Get<T4>();
|
// var service4 = Get<T4>();
|
||||||
var service5 = Get<T5>();
|
// var service5 = Get<T5>();
|
||||||
action(service1, service2, service3, service4, service5);
|
// action(service1, service2, service3, service4, service5);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Run<T1, T2, T3, T4, T5, T6>(Action<T1, T2, T3, T4, T5, T6> action)
|
// public IServiceContainer Run<T1, T2, T3, T4, T5, T6>(Action<T1, T2, T3, T4, T5, T6> action)
|
||||||
{
|
// {
|
||||||
var service1 = Get<T1>();
|
// var service1 = Get<T1>();
|
||||||
var service2 = Get<T2>();
|
// var service2 = Get<T2>();
|
||||||
var service3 = Get<T3>();
|
// var service3 = Get<T3>();
|
||||||
var service4 = Get<T4>();
|
// var service4 = Get<T4>();
|
||||||
var service5 = Get<T5>();
|
// var service5 = Get<T5>();
|
||||||
var service6 = Get<T6>();
|
// var service6 = Get<T6>();
|
||||||
action(service1, service2, service3, service4, service5, service6);
|
// action(service1, service2, service3, service4, service5, service6);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7>(Action<T1, T2, T3, T4, T5, T6, T7> action)
|
// public IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7>(Action<T1, T2, T3, T4, T5, T6, T7> action)
|
||||||
{
|
// {
|
||||||
var service1 = Get<T1>();
|
// var service1 = Get<T1>();
|
||||||
var service2 = Get<T2>();
|
// var service2 = Get<T2>();
|
||||||
var service3 = Get<T3>();
|
// var service3 = Get<T3>();
|
||||||
var service4 = Get<T4>();
|
// var service4 = Get<T4>();
|
||||||
var service5 = Get<T5>();
|
// var service5 = Get<T5>();
|
||||||
var service6 = Get<T6>();
|
// var service6 = Get<T6>();
|
||||||
var service7 = Get<T7>();
|
// var service7 = Get<T7>();
|
||||||
action(service1, service2, service3, service4, service5, service6, service7);
|
// action(service1, service2, service3, service4, service5, service6, service7);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7, T8>(Action<T1, T2, T3, T4, T5, T6, T7, T8> action)
|
// public IServiceContainer Run<T1, T2, T3, T4, T5, T6, T7, T8>(Action<T1, T2, T3, T4, T5, T6, T7, T8> action)
|
||||||
{
|
// {
|
||||||
var service1 = Get<T1>();
|
// var service1 = Get<T1>();
|
||||||
var service2 = Get<T2>();
|
// var service2 = Get<T2>();
|
||||||
var service3 = Get<T3>();
|
// var service3 = Get<T3>();
|
||||||
var service4 = Get<T4>();
|
// var service4 = Get<T4>();
|
||||||
var service5 = Get<T5>();
|
// var service5 = Get<T5>();
|
||||||
var service6 = Get<T6>();
|
// var service6 = Get<T6>();
|
||||||
var service7 = Get<T7>();
|
// var service7 = Get<T7>();
|
||||||
var service8 = Get<T8>();
|
// var service8 = Get<T8>();
|
||||||
action(service1, service2, service3, service4, service5, service6, service7, service8);
|
// action(service1, service2, service3, service4, service5, service6, service7, service8);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
#endregion
|
// #endregion
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/* public interface IServiceContainer
|
// /* public interface IServiceContainer
|
||||||
{
|
// {
|
||||||
ServiceContainer Register<T>(params object[] parameters);
|
// ServiceContainer Register<T>(params object[] parameters);
|
||||||
ServiceContainer Register<TService, TImplementation>(params object[] parameters) where TImplementation : TService;
|
// ServiceContainer Register<TService, TImplementation>(params object[] parameters) where TImplementation : TService;
|
||||||
TService Resolve<TService>();
|
// TService Resolve<TService>();
|
||||||
void Get<T>(Action<T> action);
|
// void Get<T>(Action<T> action);
|
||||||
object Instantiate(Type type, params object[] parameters);
|
// object Instantiate(Type type, params object[] parameters);
|
||||||
|
|
||||||
}
|
// }
|
||||||
public class ServiceContainer : IServiceContainer
|
// public class ServiceContainer : IServiceContainer
|
||||||
{
|
// {
|
||||||
private readonly Dictionary<Type, object> _dependencies;
|
// private readonly Dictionary<Type, object> _dependencies;
|
||||||
public ServiceContainer()
|
// public ServiceContainer()
|
||||||
{
|
// {
|
||||||
_dependencies = new Dictionary<Type, object>
|
// _dependencies = new Dictionary<Type, object>
|
||||||
{
|
// {
|
||||||
[typeof(IServiceContainer)] = this
|
// [typeof(IServiceContainer)] = this
|
||||||
};
|
// };
|
||||||
}
|
// }
|
||||||
|
|
||||||
public void Get<T>(Action<T> action)
|
// public void Get<T>(Action<T> action)
|
||||||
{
|
// {
|
||||||
var service = Resolve<T>();
|
// var service = Resolve<T>();
|
||||||
action(service);
|
// action(service);
|
||||||
}
|
// }
|
||||||
public ServiceContainer Register<T>(params object[] parameters)
|
// public ServiceContainer Register<T>(params object[] parameters)
|
||||||
{
|
// {
|
||||||
var instance = Instantiate(typeof(T), parameters);
|
// var instance = Instantiate(typeof(T), parameters);
|
||||||
_dependencies[typeof(T)] = instance;
|
// _dependencies[typeof(T)] = instance;
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
public ServiceContainer Register<TService, TImplementation>(params object[] parameters)
|
// public ServiceContainer Register<TService, TImplementation>(params object[] parameters)
|
||||||
where TImplementation : TService
|
// where TImplementation : TService
|
||||||
{
|
// {
|
||||||
|
|
||||||
_dependencies[typeof(TService)] = Instantiate(typeof(TImplementation), parameters);
|
// _dependencies[typeof(TService)] = Instantiate(typeof(TImplementation), parameters);
|
||||||
return this;
|
// return this;
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
public TService Resolve<TService>()
|
// public TService Resolve<TService>()
|
||||||
{
|
// {
|
||||||
return (TService)_dependencies[typeof(TService)];
|
// return (TService)_dependencies[typeof(TService)];
|
||||||
}
|
// }
|
||||||
|
|
||||||
public object Instantiate(Type controllerType, params object[] parameters)
|
// public object Instantiate(Type controllerType, params object[] parameters)
|
||||||
{
|
// {
|
||||||
var constructors = controllerType.GetConstructors(); // 获取控制器的所有构造函数
|
// var constructors = controllerType.GetConstructors(); // 获取控制器的所有构造函数
|
||||||
|
|
||||||
// 查找具有最多参数的构造函数
|
// // 查找具有最多参数的构造函数
|
||||||
var constructor = constructors.OrderByDescending(c => c.GetParameters().Length).FirstOrDefault();
|
// var constructor = constructors.OrderByDescending(c => c.GetParameters().Length).FirstOrDefault();
|
||||||
|
|
||||||
if (constructor != null)
|
// if (constructor != null)
|
||||||
{
|
// {
|
||||||
if (parameters.Length > 0)
|
// if (parameters.Length > 0)
|
||||||
{
|
// {
|
||||||
return Activator.CreateInstance(controllerType, parameters);
|
// return Activator.CreateInstance(controllerType, parameters);
|
||||||
}
|
// }
|
||||||
else {
|
// else {
|
||||||
var tmpParameters = constructor.GetParameters();
|
// var tmpParameters = constructor.GetParameters();
|
||||||
var dependencyInstances = new List<object>();
|
// var dependencyInstances = new List<object>();
|
||||||
|
|
||||||
foreach (var parameter in tmpParameters)
|
// foreach (var parameter in tmpParameters)
|
||||||
{
|
// {
|
||||||
var parameterType = parameter.ParameterType;
|
// var parameterType = parameter.ParameterType;
|
||||||
_dependencies.TryGetValue(parameterType, out var dependencyInstance);
|
// _dependencies.TryGetValue(parameterType, out var dependencyInstance);
|
||||||
dependencyInstances.Add(dependencyInstance);
|
// dependencyInstances.Add(dependencyInstance);
|
||||||
if (dependencyInstance == null)
|
// if (dependencyInstance == null)
|
||||||
{
|
// {
|
||||||
return null;
|
// return null;
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
// 用解析的依赖项实例化目标类型
|
// // 用解析的依赖项实例化目标类型
|
||||||
return Activator.CreateInstance(controllerType, dependencyInstances.ToArray());
|
// return Activator.CreateInstance(controllerType, dependencyInstances.ToArray());
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
else
|
// else
|
||||||
{
|
// {
|
||||||
return Activator.CreateInstance(controllerType);
|
// return Activator.CreateInstance(controllerType);
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}*/
|
// }*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
//}
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.Tool;
|
||||||
using Serein.DynamicFlow.Tool;
|
using Serein.Library.Http;
|
||||||
using Serein.Web;
|
|
||||||
using DynamicDemo.Node;
|
|
||||||
using SqlSugar;
|
|
||||||
using System;
|
|
||||||
using System.Reflection;
|
|
||||||
using static MyDll.PlcDevice;
|
using static MyDll.PlcDevice;
|
||||||
namespace MyDll
|
namespace MyDll
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -3,9 +3,8 @@ using OpenQA.Selenium.Chrome;
|
|||||||
using OpenQA.Selenium.Edge;
|
using OpenQA.Selenium.Edge;
|
||||||
using OpenQA.Selenium.Firefox;
|
using OpenQA.Selenium.Firefox;
|
||||||
using OpenQA.Selenium.IE;
|
using OpenQA.Selenium.IE;
|
||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.Tool;
|
using Serein.Flow.Tool;
|
||||||
using Serein.Web;
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
|
|
||||||
namespace Serein.Module
|
namespace Serein.Module
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using Serein;
|
using Serein;
|
||||||
using Serein.DynamicFlow.SerinExpression;
|
using Serein.Flow.SerinExpression;
|
||||||
using Serein.WorkBench.Themes;
|
using Serein.WorkBench.Themes;
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using SqlSugar;
|
using SqlSugar;
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ using Serein.WorkBench.tool;
|
|||||||
using Microsoft.Win32;
|
using Microsoft.Win32;
|
||||||
using Newtonsoft.Json.Linq;
|
using Newtonsoft.Json.Linq;
|
||||||
using Serein;
|
using Serein;
|
||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.DynamicFlow.Tool;
|
using Serein.Flow.Tool;
|
||||||
using System.Collections.Concurrent;
|
using System.Collections.Concurrent;
|
||||||
using System.Diagnostics;
|
using System.Diagnostics;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
@@ -22,6 +22,7 @@ using static Serein.WorkBench.Connection;
|
|||||||
using DynamicDemo.Node;
|
using DynamicDemo.Node;
|
||||||
using Npgsql.Logging;
|
using Npgsql.Logging;
|
||||||
using System.Threading.Tasks.Dataflow;
|
using System.Threading.Tasks.Dataflow;
|
||||||
|
using Serein.Library.IOC;
|
||||||
|
|
||||||
namespace Serein.WorkBench
|
namespace Serein.WorkBench
|
||||||
{
|
{
|
||||||
@@ -120,7 +121,7 @@ namespace Serein.WorkBench
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 节点的命名空间
|
/// 节点的命名空间
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public const string NodeSpaceName = $"{nameof(Serein)}.{nameof(Serein.DynamicFlow)}.{nameof(Serein.DynamicFlow.NodeModel)}";
|
public const string NodeSpaceName = $"{nameof(Serein)}.{nameof(Serein.Flow)}.{nameof(Serein.Flow.NodeModel)}";
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 一种轻量的IOC容器
|
/// 一种轻量的IOC容器
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1328,7 +1329,6 @@ namespace Serein.WorkBench
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 控件的鼠标左键松开事件,结束拖动操作,创建连线
|
/// 控件的鼠标左键松开事件,结束拖动操作,创建连线
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1380,24 +1380,6 @@ namespace Serein.WorkBench
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (startConnectBlock != null && isRegion && startConnectBlock.Node.MethodDetails != null && startConnectBlock.Node.MethodDetails.MethodDynamicType == DynamicNodeType.Action)
|
|
||||||
{
|
|
||||||
if (!targetBlock.Node.MethodDetails.IsCanConnect(startConnectBlock.Node.MethodDetails.ReturnType))
|
|
||||||
{
|
|
||||||
|
|
||||||
string mboxStr = "类型不匹配。" +
|
|
||||||
"\r\n" +
|
|
||||||
$"起始节点:{startConnectBlock.Node.MethodDetails.MethodName}" + "\r\n" +
|
|
||||||
$"返回类型:{startConnectBlock.Node.MethodDetails.ReturnType.Name}" + "\r\n" +
|
|
||||||
"\r\n" +
|
|
||||||
$"起始节点:{targetBlock.Node.MethodDetails.MethodName}" + "\r\n" +
|
|
||||||
$"接收类型:{string.Join("\r\n", targetBlock.Node.MethodDetails.ExplicitDatas.Select(it => it.ToString()))}" + "\r\n";
|
|
||||||
|
|
||||||
MessageBox.Show(mboxStr);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (startConnectBlock != null && targetBlock != null && startConnectBlock != targetBlock)
|
if (startConnectBlock != null && targetBlock != null && startConnectBlock != targetBlock)
|
||||||
{
|
{
|
||||||
|
|
||||||
@@ -1523,6 +1505,8 @@ namespace Serein.WorkBench
|
|||||||
FlowChartCanvas.Height = scrollViewerViewportHeight;
|
FlowChartCanvas.Height = scrollViewerViewportHeight;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 删除该控件,以及与该控件相关的所有连线
|
/// 删除该控件,以及与该控件相关的所有连线
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1717,6 +1701,10 @@ namespace Serein.WorkBench
|
|||||||
|
|
||||||
}*/
|
}*/
|
||||||
}
|
}
|
||||||
|
/// <summary>
|
||||||
|
/// 树形结构展开类型的成员
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="type"></param>
|
||||||
private void DisplayReturnTypeTreeViewer(Type type)
|
private void DisplayReturnTypeTreeViewer(Type type)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.WorkBench.Node.ViewModel;
|
using Serein.WorkBench.Node.ViewModel;
|
||||||
|
|
||||||
namespace Serein.WorkBench.Node.View
|
namespace Serein.WorkBench.Node.View
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Controls.Primitives;
|
using System.Windows.Controls.Primitives;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.WorkBench.Node.ViewModel;
|
using Serein.WorkBench.Node.ViewModel;
|
||||||
using static Serein.WorkBench.MainWindow;
|
using static Serein.WorkBench.MainWindow;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Controls.Primitives;
|
using System.Windows.Controls.Primitives;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
using System.Windows.Input;
|
using System.Windows.Input;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.WorkBench.Node.ViewModel;
|
using Serein.WorkBench.Node.ViewModel;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.WorkBench.Node.ViewModel;
|
using Serein.WorkBench.Node.ViewModel;
|
||||||
using System.Windows;
|
using System.Windows;
|
||||||
using System.Windows.Controls;
|
using System.Windows.Controls;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.WorkBench.Themes;
|
using Serein.WorkBench.Themes;
|
||||||
using System.Collections.ObjectModel;
|
using System.Collections.ObjectModel;
|
||||||
using System.Collections.Specialized;
|
using System.Collections.Specialized;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.WorkBench.Node.View;
|
using Serein.WorkBench.Node.View;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.WorkBench.Node.View;
|
using Serein.WorkBench.Node.View;
|
||||||
using System.ComponentModel;
|
using System.ComponentModel;
|
||||||
using System.Runtime.CompilerServices;
|
using System.Runtime.CompilerServices;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.WorkBench.Node.View;
|
using Serein.WorkBench.Node.View;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Serein.DynamicFlow.NodeModel;
|
using Serein.Flow.NodeModel;
|
||||||
using Serein.WorkBench.Node.View;
|
using Serein.WorkBench.Node.View;
|
||||||
|
|
||||||
namespace Serein.WorkBench.Node.ViewModel
|
namespace Serein.WorkBench.Node.ViewModel
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
using Serein.DynamicFlow;
|
using Serein.Flow;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
|||||||
Reference in New Issue
Block a user