如果使用 Autofac.Extras.Quartz,则依赖注入不起作用
Dependency injection does not work if Autofac.Extras.Quartz is used
描述
我读了很多如何配置 Autofac.Extras.Quartz 以添加 Autofac 集成,但它根本行不通,我为这些问题而苦恼:
- 通过构造函数的依赖注入不起作用(但如果我添加无参数构造函数 - 它被调用)
- 仅调用上次注册的作业,在上次作业之前添加的触发器 - 从未触发
我花了很多时间弄清楚如何正确启动它(这看起来很简单但在我的情况下不可行),这与我的案例 closed issue 项目最相关,人们遇到了同样的问题,但经历它并没有帮助。
感谢任何帮助。
代码:
...
// Configure Autofac
var builder = new ContainerBuilder();
...
builder.RegisterModule<AutofacRepositoryModule>(); // registration of repositores
...
builder.RegisterModule(new QuartzAutofacFactoryModule());
builder.RegisterModule(new QuartzAutofacJobsModule(typeof(ConvertOrdersJob).Assembly));
builder.RegisterType<JobScheduler>().AsSelf();
var container = builder.Build();
ConfigureScheduler(container);
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
...
private static void ConfigureScheduler(IContainer container)
{
var scheduler = container.Resolve<JobScheduler>();
scheduler.Start();
}
在 AutofacRepositoryModule 中注册存储库:
public class AutofacRepositoryModule : Module
{
protected override void Load(ContainerBuilder builder)
{
...
builder.RegisterType<DumpReportRepository>().As<IDumpReportRepository>();
...
}
}
配置作业:
public class JobScheduler
{
private IScheduler _scheduler;
public JobScheduler(IScheduler scheduler)
{
_scheduler = scheduler;
}
public void Start()
{
// BUG1: Find out why cleanupDumpsTrigger never fired
// BUG2: Dependency injection via constructor does not work
var cleanupDumpsJob = JobBuilder.Create<DumpsCleanupJob>().Build();
var cleanupDumpsTrigger = TriggerBuilder.Create()
.WithIdentity("CleanupDumpsTrigger", "dumps")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInHours(24)
.RepeatForever())
.Build();
_scheduler.ScheduleJob(cleanupDumpsJob, cleanupDumpsTrigger);
var convertOrdersJob = JobBuilder.Create<ConvertOrdersJob>().Build();
var convertOrdersTrigger = TriggerBuilder.Create()
.WithIdentity("ConvertOrdersTrigger", "orders")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInHours(1)
.RepeatForever())
.Build();
_scheduler.ScheduleJob(convertOrdersJob, convertOrdersTrigger);
_scheduler.Start();
}
工作示例:
[DisallowConcurrentExecution]
public class DumpsCleanupJob : IJob
{
private readonly IDumpReportRepository _dumpReportRepository;
public DumpsCleanupJob(IDumpReportRepository dumpReportRepository)
{
// BUG: Constructor is never called
_dumpReportRepository = dumpReportRepository;
}
public void Execute(IJobExecutionContext context)
{
try
{
...
}
catch (Exception ex)
{
...
}
}
}
版本:
我尝试了一堆版本的 Quartz (2.x-3.x)/Autofac.Extras.Quartz (3.x-4.0.0)
解决方法
临时解决方案:
- Autofac.Extras.Quartz 的用法已删除
- 所有依赖项都在无参数构造函数中简单创建
- 使用默认调度程序
_scheduler = StdSchedulerFactory.GetDefaultScheduler()
配置所有作业(所有作业均已正确启动)
如果包不起作用,那么将实现自定义 AutofacJobFactory。
您可以尝试使用自定义 IJobFactory 创建作业。
scheduler.JobFactory = new JobFactoryInjection(container);
描述
我读了很多如何配置 Autofac.Extras.Quartz 以添加 Autofac 集成,但它根本行不通,我为这些问题而苦恼:
- 通过构造函数的依赖注入不起作用(但如果我添加无参数构造函数 - 它被调用)
- 仅调用上次注册的作业,在上次作业之前添加的触发器 - 从未触发
我花了很多时间弄清楚如何正确启动它(这看起来很简单但在我的情况下不可行),这与我的案例 closed issue 项目最相关,人们遇到了同样的问题,但经历它并没有帮助。 感谢任何帮助。
代码:
...
// Configure Autofac
var builder = new ContainerBuilder();
...
builder.RegisterModule<AutofacRepositoryModule>(); // registration of repositores
...
builder.RegisterModule(new QuartzAutofacFactoryModule());
builder.RegisterModule(new QuartzAutofacJobsModule(typeof(ConvertOrdersJob).Assembly));
builder.RegisterType<JobScheduler>().AsSelf();
var container = builder.Build();
ConfigureScheduler(container);
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
...
private static void ConfigureScheduler(IContainer container)
{
var scheduler = container.Resolve<JobScheduler>();
scheduler.Start();
}
在 AutofacRepositoryModule 中注册存储库:
public class AutofacRepositoryModule : Module
{
protected override void Load(ContainerBuilder builder)
{
...
builder.RegisterType<DumpReportRepository>().As<IDumpReportRepository>();
...
}
}
配置作业:
public class JobScheduler
{
private IScheduler _scheduler;
public JobScheduler(IScheduler scheduler)
{
_scheduler = scheduler;
}
public void Start()
{
// BUG1: Find out why cleanupDumpsTrigger never fired
// BUG2: Dependency injection via constructor does not work
var cleanupDumpsJob = JobBuilder.Create<DumpsCleanupJob>().Build();
var cleanupDumpsTrigger = TriggerBuilder.Create()
.WithIdentity("CleanupDumpsTrigger", "dumps")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInHours(24)
.RepeatForever())
.Build();
_scheduler.ScheduleJob(cleanupDumpsJob, cleanupDumpsTrigger);
var convertOrdersJob = JobBuilder.Create<ConvertOrdersJob>().Build();
var convertOrdersTrigger = TriggerBuilder.Create()
.WithIdentity("ConvertOrdersTrigger", "orders")
.StartNow()
.WithSimpleSchedule(x => x
.WithIntervalInHours(1)
.RepeatForever())
.Build();
_scheduler.ScheduleJob(convertOrdersJob, convertOrdersTrigger);
_scheduler.Start();
}
工作示例:
[DisallowConcurrentExecution]
public class DumpsCleanupJob : IJob
{
private readonly IDumpReportRepository _dumpReportRepository;
public DumpsCleanupJob(IDumpReportRepository dumpReportRepository)
{
// BUG: Constructor is never called
_dumpReportRepository = dumpReportRepository;
}
public void Execute(IJobExecutionContext context)
{
try
{
...
}
catch (Exception ex)
{
...
}
}
}
版本:
我尝试了一堆版本的 Quartz (2.x-3.x)/Autofac.Extras.Quartz (3.x-4.0.0)
解决方法
临时解决方案:
- Autofac.Extras.Quartz 的用法已删除
- 所有依赖项都在无参数构造函数中简单创建
- 使用默认调度程序
_scheduler = StdSchedulerFactory.GetDefaultScheduler()
配置所有作业(所有作业均已正确启动)
如果包不起作用,那么将实现自定义 AutofacJobFactory。
您可以尝试使用自定义 IJobFactory 创建作业。
scheduler.JobFactory = new JobFactoryInjection(container);