using Autofac;
using CirculateTool.Attribute;
using CirculateTool;
using WcsMain.WcsAttribute.AutoFacAttribute;
namespace WcsMain.Plugins;
///
/// 新的 WCS 定时任务类,添加 IOC 容器支持,添加非静态变量支持
///
[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 */
}
}
}
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