.NET Core API中使用FluentScheduler时的依赖注入异常问题
解决FluentScheduler中Job的依赖注入问题
你遇到的是FluentScheduler默认不支持依赖注入的典型问题——它默认会尝试用无参构造函数实例化你的InfoLoader,但你的类依赖DataContext,所以直接初始化调度器会抛出实例创建失败的异常。下面是具体的解决步骤:
1. 自定义JobFactory来支持DI
首先,我们需要实现FluentScheduler的IJobFactory接口,让它从你的依赖注入容器中获取Job实例,而不是自己创建:
using FluentScheduler; using Microsoft.Extensions.DependencyInjection; public class DiJobFactory : IJobFactory { private readonly IServiceProvider _serviceProvider; public DiJobFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public IJob GetJobInstance(Type jobType) { // 从DI容器中解析Job实例,自动处理依赖 return (IJob)_serviceProvider.GetRequiredService(jobType); } }
2. 配置依赖注入容器
在你的Program.cs中,先注册所有需要的服务(包括DataContext和你的InfoLoader):
var services = new ServiceCollection(); // 注册DataContext(根据你的实际数据库类型调整,比如SQL Server) services.AddDbContext<DataContext>(options => options.UseSqlServer("YourConnectionStringHere"), ServiceLifetime.Scoped); // 注册你的Job类,用Transient或者Scoped都可以,根据需求调整 services.AddTransient<InfoLoader>(); var serviceProvider = services.BuildServiceProvider();
3. 替换FluentScheduler的默认JobFactory
在初始化调度器之前,把我们自定义的工厂传给JobManager:
// 设置自定义JobFactory JobManager.JobFactory = new DiJobFactory(serviceProvider); // 初始化调度器 JobManager.Initialize(new LoadersRegistry());
4. 保持你的Registry不变
你的LoadersRegistry不需要修改,依然可以直接调度InfoLoader:
public class LoadersRegistry : Registry { public LoadersRegistry() { // 每小时执行一次InfoLoader Schedule<InfoLoader>().ToRunEvery(1).Hours(); } }
为什么这样能解决问题?
FluentScheduler的默认JobFactory使用Activator.CreateInstance来创建Job实例,这要求类必须有公共的无参构造函数。而通过自定义工厂,我们把实例创建的控制权交给了DI容器,它会自动解析InfoLoader依赖的DataContext,并创建完整的实例。
如果你的应用是ASP.NET Core,还可以直接利用内置的DI容器,不需要手动构建ServiceCollection——只需要把DiJobFactory注册为单例,然后在启动时设置JobManager.JobFactory即可。
内容的提问来源于stack exchange,提问作者V. Panchenko
相关产品推荐
相关产品推荐

