using Autofac; using AutoMapper; using Newtonsoft.Json; using Quartz; using Serilog; using System; using System.Collections.Generic; using System.Reflection; using System.Text; using System.Threading.Tasks; using Utility.Entity; namespace Utility.Job { public class InternalMethodJob : JobBase, IJob { public InternalMethodJob() : base(new LogModel()) { } public override async Task NextExecute(IJobExecutionContext context) { // 获取相关参数 var className = context.JobDetail.JobDataMap.GetString(Constant.CLASSNAME)?.Trim(); var methodName = context.JobDetail.JobDataMap.GetString(Constant.METHODNAME)?.Trim(); var methodParameters = context.JobDetail.JobDataMap.GetString(Constant.METHODPARAMETERS); try { /// 加载 WMS.BLL 类库 Assembly assembly; try { assembly = Assembly.LoadFrom("WMS.BLL.dll"); } catch (Exception) { assembly = Assembly.LoadFrom("bin\\Debug\\netcoreapp3.1\\WMS.BLL.dll"); } // 获取 WMS.BLL的类型 Type classType = assembly.GetType("WMS.BLL." + className); if (classType == null) { throw new TypeLoadException($"找不到该类型{className}"); } #region 容器创建示例 有报错搞不定抽空再弄 //var builder = new ContainerBuilder(); //// 注册需要的服务和类型 //builder.RegisterAssemblyTypes(Assembly.Load("WMS.IDAL"), Assembly.Load("WMS.DAL"), Assembly.Load("WMS.IBLL"), // Assembly.Load("WMS.BLL")); //builder.RegisterType().As(); //// 使用 Autofac 容器来解析类的实例 //var scope = builder.Build(); //var instance = scope.Resolve(classType); #endregion // 创建实例(如果方法是实例方法) 无注入 必须有空参数的构造函数 object instance = Activator.CreateInstance(classType); // 获取方法信息 MethodInfo methodInfo = classType.GetMethod(methodName); if (methodInfo == null) { throw new ArgumentException($"找不到该方法{methodName}"); } // 调用方法 object result = null; if (methodInfo.GetParameters().Length == 0) { // 无参方法 result = methodInfo.Invoke(instance, null); } else { // 有参方法 var parameters = JsonConvert.DeserializeObject(methodParameters); // 解析方法参数 result = await (Task)methodInfo.Invoke(instance, parameters); } // 处理方法执行结果 LogInfo.Result = JsonConvert.SerializeObject(result); } catch (Exception ex) { LogInfo.ErrorMsg = ex.Message; context.JobDetail.JobDataMap[Constant.EXCEPTION] = $"
{LogInfo.BeginTime}
{JsonConvert.SerializeObject(LogInfo)}"; } //_logger.Error(ex, $"执行方法时出错 {methodName}: {ex.Message}"); } } }