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<LogModel>, 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<Mapper>().As<IMapper>();
|
|
//// 使用 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<object[]>(methodParameters); // 解析方法参数
|
result = await (Task<object>)methodInfo.Invoke(instance, parameters);
|
}
|
|
// 处理方法执行结果
|
LogInfo.Result = JsonConvert.SerializeObject(result);
|
}
|
catch (Exception ex)
|
{
|
LogInfo.ErrorMsg = ex.Message;
|
context.JobDetail.JobDataMap[Constant.EXCEPTION] = $"<div class='err-time'>{LogInfo.BeginTime}</div>{JsonConvert.SerializeObject(LogInfo)}";
|
}
|
//_logger.Error(ex, $"执行方法时出错 {methodName}: {ex.Message}");
|
}
|
}
|
}
|