wcs_server_kate_suzhou/WcsMain/Plugins/WcsCirculation.cs

79 lines
3.1 KiB
C#
Raw Normal View History

2024-05-14 16:30:56 +08:00
using Autofac;
using CirculateTool.Attribute;
2024-05-14 16:30:56 +08:00
using CirculateTool;
using WcsMain.WcsAttribute.AutoFacAttribute;
namespace WcsMain.Plugins;
/// <summary>
/// 新的 WCS 定时任务类,添加 IOC 容器支持,添加非静态变量支持
/// </summary>
[Component]
public class WcsCirculation(IComponentContext componentContext) : StartCirculation
{
private readonly IComponentContext _componentContext = componentContext;
public override void StartTask(Type type, object[]? instanceParams = null)
{
object? instance = null;
var methods = type.GetMethods();
foreach (var method in methods)
{
var attributes = method.GetCustomAttributes(false);
foreach (var attribute in attributes)
{
if (attribute == default) continue;
/* 定时执行的任务 */
if (attribute is CirculationAttribute needDurable)
{
string methodDescription = needDurable.MethodDescription ?? $"{type.Name}.{method.Name}";
instance ??= CreateInstance(type);
bool Action() => (bool)(method.Invoke(instance, []) ?? false);
StartTask(Action, methodDescription, needDurable.CirculationTime);
break;
}
/* 每天指定时间执行 */
if (attribute is CirculationTimeAttribute timeCirculate)
{
string methodDescription = timeCirculate.MethodDescription ?? $"{type.Name}.{method.Name}";
instance ??= CreateInstance(type);
foreach (var time in timeCirculate.Times)
{
_timeTasks.Add(new CirculateTool.Entity.TimeTask
{
ExecuteTime = time,
Action = new Action(() => method.Invoke(instance, [])),
Description = methodDescription,
IsRun = false
});
}
}
/* END */
2024-05-14 16:30:56 +08:00
}
}
/* 执行按时执行的任务 ---- 方法内判断,若没有此类方法则不会执行 */
StartTimeTask();
2024-05-14 16:30:56 +08:00
}
private object? CreateInstance(Type type)
{
var constructors = type.GetConstructors();
var constructorList = constructors.ToList();
constructorList = [.. constructorList.OrderByDescending(s => s.GetParameters().Length)];
foreach (var constructor in constructorList)
{
var parameters = constructor.GetParameters();
if (parameters.Length == 0) return Activator.CreateInstance(type);
List<object> arguments = [];
foreach (var parameter in parameters)
{
object par = _componentContext.Resolve(parameter.ParameterType);
arguments.Add(par);
}
return Activator.CreateInstance(type, [.. arguments]);
}
return Activator.CreateInstance(type);
}
}