尝试整合分类代码文件

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.Threading.Tasks;
namespace Serein.DynamicFlow
namespace Serein.Flow
{
public interface IDynamicFlowNode
{

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.DynamicFlow
namespace Serein.Flow
{
public enum DynamicNodeType

View File

@@ -1,4 +1,5 @@
using DynamicDemo.Node;
using Serein.Library.IOC;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@@ -9,7 +10,7 @@ using System.Threading.Tasks;
using static System.Collections.Specialized.BitVector32;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace Serein.DynamicFlow
namespace Serein.Flow
{
public enum FfState

View File

@@ -5,7 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using static Dm.net.buffer.ByteArrayBuffer;
namespace Serein.DynamicFlow
namespace Serein.Flow
{
/// <summary>
/// 显式参数

View File

@@ -1,15 +1,9 @@
using Serein;
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.DynamicFlow.Tool;
using Serein.Web;
using Serein.Flow;
using Serein.Flow.NodeModel;
using Serein.Flow.Tool;
using Serein.Library.Http;
using Serein.Library.IOC;
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
{

View File

@@ -1,8 +1,8 @@
using Serein.DynamicFlow;
using Serein.Flow;
using System.Collections.Generic;
using System.Diagnostics;
namespace Serein.DynamicFlow.NodeModel
namespace Serein.Flow.NodeModel
{
/// <summary>

View File

@@ -1,9 +1,9 @@
using Serein.DynamicFlow.Tool;
using Serein.Flow.Tool;
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace Serein.DynamicFlow.NodeModel
namespace Serein.Flow.NodeModel
{
/// <summary>

View File

@@ -4,7 +4,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.DynamicFlow.NodeModel
namespace Serein.Flow.NodeModel
{
public class CompositeLoopNode : NodeBase
{

View File

@@ -1,5 +1,5 @@
using Serein.DynamicFlow;
using Serein.DynamicFlow.Tool;
using Serein.Flow;
using Serein.Flow.Tool;
using Newtonsoft.Json;
using SqlSugar;
using System;
@@ -8,7 +8,7 @@ using System.Threading;
using System.Collections.Generic;
using System.Linq;
namespace Serein.DynamicFlow.NodeModel
namespace Serein.Flow.NodeModel
{
public enum ConnectionType

View File

@@ -1,7 +1,7 @@
using Serein.DynamicFlow.Tool;
using Serein.Flow.Tool;
using System.Diagnostics;
namespace Serein.DynamicFlow.NodeModel
namespace Serein.Flow.NodeModel
{
/// <summary>
/// 单动作节点(用于动作控件)

View File

@@ -1,10 +1,10 @@
using Serein.DynamicFlow.SerinExpression;
using Serein.DynamicFlow.Tool;
using Serein.Flow.SerinExpression;
using Serein.Flow.Tool;
using System;
using System.Diagnostics;
using System.Linq.Expressions;
namespace Serein.DynamicFlow.NodeModel
namespace Serein.Flow.NodeModel
{
/// <summary>
/// 条件节点(用于条件控件)

View File

@@ -1,11 +1,11 @@
using Serein.DynamicFlow.SerinExpression;
using Serein.Flow.SerinExpression;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.DynamicFlow.NodeModel
namespace Serein.Flow.NodeModel
{
/// <summary>
/// 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

View File

@@ -2,7 +2,7 @@
using System.Reflection;
using System.Runtime.InteropServices;
namespace Serein.DynamicFlow.SerinExpression
namespace Serein.Flow.SerinExpression
{
public abstract class ConditionResolver

View File

@@ -3,7 +3,7 @@ using System.Globalization;
using System.Linq;
using System.Reflection;
namespace Serein.DynamicFlow.SerinExpression;
namespace Serein.Flow.SerinExpression;
public class SerinConditionParser
{

View File

@@ -4,10 +4,10 @@ using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using static Serein.DynamicFlow.NodeModel.SingleExpOpNode;
using static Serein.Flow.NodeModel.SingleExpOpNode;
using static System.Runtime.InteropServices.JavaScript.JSType;
namespace Serein.DynamicFlow.SerinExpression
namespace Serein.Flow.SerinExpression
{
public class SerinArithmeticExpressionEvaluator
{

View File

@@ -1,6 +1,7 @@
using Serein;
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.Flow;
using Serein.Flow.NodeModel;
using Serein.Library.IOC;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
@@ -9,7 +10,7 @@ using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
namespace Serein.DynamicFlow.Tool;
namespace Serein.Flow.Tool;
public static class DelegateCache

View File

@@ -7,7 +7,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.DynamicFlow.Tool
namespace Serein.Flow.Tool
{
#region tsk工具 (

View File

@@ -6,7 +6,7 @@ using System.Linq.Expressions;
using System.Reflection;
using System.Threading.Tasks;
namespace Serein.DynamicFlow.Tool
namespace Serein.Flow.Tool
{
/// <summary>
/// 对于实例创建的表达式树反射

View File

@@ -5,7 +5,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Serein.DynamicFlow.Tool
namespace Serein.Flow.Tool
{
public class TcsSignalException : Exception
{

View File

@@ -1,10 +1,10 @@
using Serein.DynamicFlow;
using Serein.Flow;
using System;
using System.Collections.Concurrent;
using System.Reflection.Metadata.Ecma335;
using System.Runtime.CompilerServices;
namespace Serein.DynamicFlow.Tool
namespace Serein.Flow.Tool
{

View File

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

View File

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

View File

@@ -1,8 +1,10 @@
using Serein.Tool;
using Newtonsoft.Json;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Serein.Library.IOC;
using Serein.Tool;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Net;
using System.Reflection;
using System.Text;
@@ -10,7 +12,7 @@ using System.Web;
using Enum = System.Enum;
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.Security.AccessControl;
namespace Serein.Web
namespace Serein.Library.Http
{
/// <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\**" />
</ItemGroup>
<ItemGroup>
<Compile Remove="ServiceContainer.cs" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="SqlSugarCore" Version="5.1.4.166" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\LibraryIOC\Serein.Library.IOC.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,418 +1,418 @@
using Serein.Web;
using Microsoft.Win32;
using NetTaste;
using System.Collections.Concurrent;
using System.Reflection;
using System;
using System.Linq;
using System.Collections.Generic;
using SqlSugar;
namespace Serein
{
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;
//using Serein.Web;
//using Microsoft.Win32;
//using NetTaste;
//using System.Collections.Concurrent;
//using System.Reflection;
//using System;
//using System.Linq;
//using System.Collections.Generic;
//using SqlSugar;
//namespace Serein
//{
// 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
{
// if (_dependencies.ContainsKey(type.FullName))
// {
// instance = _dependencies[type.FullName];
// }
// 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)
{
return (T)GetOrCreateServiceInstance(typeof(T), parameters);
}
// }
// 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 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)
{
// public IServiceContainer Register(Type type, params object[] parameters)
// {
if (!_typeMappings.ContainsKey(type.FullName))
{
_typeMappings[type.FullName] = type;
}
// if (!_typeMappings.ContainsKey(type.FullName))
// {
// _typeMappings[type.FullName] = type;
// }
return this;
}
public IServiceContainer Register<T>(params object[] parameters)
{
Register(typeof(T), parameters);
return this;
}
// 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 IServiceContainer Register<TService, TImplementation>(params object[] parameters)
// where TImplementation : TService
// {
// _typeMappings[typeof(TService).FullName!] = typeof(TImplementation);
// return this;
// }
public object Get(Type type)
{
// public object Get(Type type)
// {
if (!_dependencies.TryGetValue(type.FullName, out object value))
{
Register(type);
// if (!_dependencies.TryGetValue(type.FullName, out object value))
// {
// 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))
{
Register<T>();
// if(!_dependencies.TryGetValue(typeof(T).FullName, out object value))
// {
// Register<T>();
value = Instantiate(typeof(T));
// value = Instantiate(typeof(T));
}
// }
return (T)value;
// return (T)value;
//throw new InvalidOperationException("目标类型未创建实例");
}
public IServiceContainer Build()
{
foreach (var type in _typeMappings.Values)
{
// //throw new InvalidOperationException("目标类型未创建实例");
// }
// public IServiceContainer Build()
// {
// 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)
{
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);
}
}
}*/
}
// 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

@@ -1,11 +1,6 @@
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.DynamicFlow.Tool;
using Serein.Web;
using DynamicDemo.Node;
using SqlSugar;
using System;
using System.Reflection;
using Serein.Flow;
using Serein.Flow.Tool;
using Serein.Library.Http;
using static MyDll.PlcDevice;
namespace MyDll
{

View File

@@ -3,9 +3,8 @@ using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Edge;
using OpenQA.Selenium.Firefox;
using OpenQA.Selenium.IE;
using Serein.DynamicFlow;
using Serein.DynamicFlow.Tool;
using Serein.Web;
using Serein.Flow;
using Serein.Flow.Tool;
using System.Diagnostics.CodeAnalysis;
namespace Serein.Module

View File

@@ -1,5 +1,5 @@
using Serein;
using Serein.DynamicFlow.SerinExpression;
using Serein.Flow.SerinExpression;
using Serein.WorkBench.Themes;
using Newtonsoft.Json;
using SqlSugar;

View File

@@ -5,9 +5,9 @@ using Serein.WorkBench.tool;
using Microsoft.Win32;
using Newtonsoft.Json.Linq;
using Serein;
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.DynamicFlow.Tool;
using Serein.Flow;
using Serein.Flow.NodeModel;
using Serein.Flow.Tool;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.IO;
@@ -22,6 +22,7 @@ using static Serein.WorkBench.Connection;
using DynamicDemo.Node;
using Npgsql.Logging;
using System.Threading.Tasks.Dataflow;
using Serein.Library.IOC;
namespace Serein.WorkBench
{
@@ -120,7 +121,7 @@ namespace Serein.WorkBench
/// <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>
/// 一种轻量的IOC容器
/// </summary>
@@ -1328,7 +1329,6 @@ namespace Serein.WorkBench
}
}
/// <summary>
/// 控件的鼠标左键松开事件,结束拖动操作,创建连线
/// </summary>
@@ -1380,24 +1380,6 @@ namespace Serein.WorkBench
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)
{
@@ -1523,6 +1505,8 @@ namespace Serein.WorkBench
FlowChartCanvas.Height = scrollViewerViewportHeight;
}
}
/// <summary>
/// 删除该控件,以及与该控件相关的所有连线
/// </summary>
@@ -1717,6 +1701,10 @@ namespace Serein.WorkBench
}*/
}
/// <summary>
/// 树形结构展开类型的成员
/// </summary>
/// <param name="type"></param>
private void DisplayReturnTypeTreeViewer(Type type)
{
try

View File

@@ -1,4 +1,4 @@
using Serein.DynamicFlow.NodeModel;
using Serein.Flow.NodeModel;
using Serein.WorkBench.Node.ViewModel;
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.Controls;
using System.Windows.Controls.Primitives;

View File

@@ -1,5 +1,5 @@
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.Flow;
using Serein.Flow.NodeModel;
using Serein.WorkBench.Node.ViewModel;
using static Serein.WorkBench.MainWindow;
using System.Windows.Controls;

View File

@@ -1,5 +1,5 @@
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.Flow;
using Serein.Flow.NodeModel;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;

View File

@@ -1,4 +1,4 @@
using Serein.DynamicFlow;
using Serein.Flow;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

View File

@@ -1,4 +1,4 @@
using Serein.DynamicFlow.NodeModel;
using Serein.Flow.NodeModel;
using Serein.WorkBench.Node.ViewModel;
using System;
using System.Collections.Generic;

View File

@@ -1,5 +1,5 @@
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.Flow;
using Serein.Flow.NodeModel;
using Serein.WorkBench.Node.ViewModel;
using System.Windows;
using System.Windows.Controls;

View File

@@ -1,5 +1,5 @@
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.Flow;
using Serein.Flow.NodeModel;
using Serein.WorkBench.Themes;
using System.Collections.ObjectModel;
using System.Collections.Specialized;

View File

@@ -1,5 +1,5 @@
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.Flow;
using Serein.Flow.NodeModel;
using Serein.WorkBench.Node.View;
using System.ComponentModel;
using System.Runtime.CompilerServices;

View File

@@ -1,5 +1,5 @@
using Serein.DynamicFlow;
using Serein.DynamicFlow.NodeModel;
using Serein.Flow;
using Serein.Flow.NodeModel;
using Serein.WorkBench.Node.View;
using System.ComponentModel;
using System.Runtime.CompilerServices;

View File

@@ -1,4 +1,4 @@
using Serein.DynamicFlow.NodeModel;
using Serein.Flow.NodeModel;
using Serein.WorkBench.Node.View;
using System;
using System.Collections.Generic;

View File

@@ -1,4 +1,4 @@
using Serein.DynamicFlow.NodeModel;
using Serein.Flow.NodeModel;
using Serein.WorkBench.Node.View;
namespace Serein.WorkBench.Node.ViewModel

View File

@@ -1,4 +1,4 @@
using Serein.DynamicFlow;
using Serein.Flow;
using System;
using System.Collections;
using System.Collections.Generic;