using Microsoft.Extensions.DependencyInjection; using Quartz.Spi; using Quartz; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace WIDESEA_Core.QuartzJob { /// /// 任务调度 启动服务 /// public static class JobSetup { public static void AddJobSetup(this IServiceCollection services) { if (services == null) throw new ArgumentNullException(nameof(services)); //将JobFactory注入到服务中 services.AddSingleton(); //将SchedulerCenterServer注入到服务中 services.AddSingleton(); //任务注入 var baseType = typeof(IJob); //获取当前应用程序域的相对搜索路径 var path = AppDomain.CurrentDomain.RelativeSearchPath ?? AppDomain.CurrentDomain.BaseDirectory; //获取指定路径下的所有程序集 var referencedAssemblies = System.IO.Directory.GetFiles(path, "WIDESEA_Tasks.dll").Select(Assembly.LoadFrom).ToArray(); //获取所有定义的类型 var types = referencedAssemblies .SelectMany(a => a.DefinedTypes) .Select(type => type.AsType()) //筛选出继承自IJob的类型 .Where(x => x != baseType && baseType.IsAssignableFrom(x)).ToArray(); //获取所有实现了IJob的类型 var implementTypes = types.Where(x => x.IsClass).ToArray(); //将所有实现了IJob的类型注入到服务中 foreach (var implementType in implementTypes) { services.AddTransient(implementType); } } } }