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 */ } } /* 执行按时执行的任务 ---- 方法内判断,若没有此类方法则不会执行 */ StartTimeTask(); } 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 arguments = []; foreach (var parameter in parameters) { object par = _componentContext.Resolve(parameter.ParameterType); arguments.Add(par); } return Activator.CreateInstance(type, [.. arguments]); } return Activator.CreateInstance(type); } }