如果使用 Autofac.Extras.Quartz,则依赖注入不起作用



说明

我读了很多如何配置 Autofac.Extras.Quartz 以添加 Autofac 集成,但它根本不起作用,我为以下问题而苦苦挣扎:

通过构造函数

  1. 的依赖注入不起作用(但是如果我添加无参数构造函数 - 它被调用(
  2. 仅调用上次注册的作业,在最后一个作业之前添加的触发器 - 从未触发
我花了很多时间来弄清楚如何正确启动它(这看起来很简单,但在我的情况下不可行(,与我的案例最相关的项目关闭问题,人们有同样的问题,但通过它没有帮助。 任何帮助,不胜感激。

法典:

...
// 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(

解决方法

临时解决方案:

  1. Autofac.Extras.Quartz 的使用被删除
  2. 所有依赖项都只是在无参数构造函数中创建
  3. 默认调度程序_scheduler = StdSchedulerFactory.GetDefaultScheduler()用于配置所有作业(所有作业都已正确启动(

如果包不起作用,则将实现自定义 AutofacJobFactory。

您可以尝试使用自定义 IJobFactory 创建作业。

scheduler.JobFactory = new JobFactoryInjection(container);

最新更新