尝试整合分类代码文件

This commit is contained in:
fengjiayi
2024-08-06 15:41:14 +08:00
parent 276e3b65e9
commit f15baf0d9b
45 changed files with 886 additions and 484 deletions

View File

@@ -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
{ {

View File

@@ -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

View File

@@ -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

View File

@@ -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>
/// 显式参数 /// 显式参数

View File

@@ -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
{ {

View File

@@ -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>

View File

@@ -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>

View File

@@ -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
{ {

View File

@@ -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

View File

@@ -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>
/// 单动作节点(用于动作控件) /// 单动作节点(用于动作控件)

View File

@@ -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>
/// 条件节点(用于条件控件) /// 条件节点(用于条件控件)

View File

@@ -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 - 表达式操作

View File

@@ -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

View File

@@ -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

View File

@@ -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
{ {

View File

@@ -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
{ {

View File

@@ -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

View File

@@ -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工具 (

View File

@@ -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>
/// 对于实例创建的表达式树反射 /// 对于实例创建的表达式树反射

View File

@@ -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
{ {

View File

@@ -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
{ {

View File

@@ -1,6 +1,6 @@
using System; using System;
namespace Serein.Web namespace Serein.Library.Http
{ {
/// <summary> /// <summary>
/// 表示参数为url中的数据Get请求中不需要显式标注 /// 表示参数为url中的数据Get请求中不需要显式标注

View File

@@ -1,4 +1,4 @@
namespace Serein.Web namespace Serein.Library.Http
{ {
public class ControllerBase public class ControllerBase
{ {

View File

@@ -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
{ {

View File

@@ -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>

View 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);
}
}
}*/
}

View File

@@ -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>

View File

@@ -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);
} // }
} // }
}*/ // }*/
} //}

View File

@@ -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
{ {

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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

View File

@@ -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;