Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如果使用Autofac.Extras.Quartz,依赖项注入将不起作用_C#_Asp.net_.net_Quartz.net - Fatal编程技术网

C# 如果使用Autofac.Extras.Quartz,依赖项注入将不起作用

C# 如果使用Autofac.Extras.Quartz,依赖项注入将不起作用,c#,asp.net,.net,quartz.net,C#,Asp.net,.net,Quartz.net,说明 我读了很多关于如何配置Autofac.Extras.Quartz以添加Autofac集成的文章,但它根本不起作用,我遇到了以下问题: 通过构造函数进行依赖项注入不起作用(但如果我添加了无参数构造函数,它将被调用) 仅调用上次注册的作业,在上次作业之前添加的触发器-从不激发 我花了很多时间来弄清楚如何正确地启动它(在我的例子中,这看起来很简单,但不可行),这与我的项目最相关,在我的项目中,人们有同样的问题,但经历它却没有帮助。 感谢您的帮助 代码: 。。。 //配置自动传真 var buil

说明

我读了很多关于如何配置Autofac.Extras.Quartz以添加Autofac集成的文章,但它根本不起作用,我遇到了以下问题:

  • 通过构造函数进行依赖项注入不起作用(但如果我添加了无参数构造函数,它将被调用)
  • 仅调用上次注册的作业,在上次作业之前添加的触发器-从不激发
  • 我花了很多时间来弄清楚如何正确地启动它(在我的例子中,这看起来很简单,但不可行),这与我的项目最相关,在我的项目中,人们有同样的问题,但经历它却没有帮助。 感谢您的帮助

    代码:

    。。。
    //配置自动传真
    var builder=new ContainerBuilder();
    ...
    builder.RegisterModule();//寄存人的登记
    ...
    RegisterModule(新的QuartZautofactoryModule());
    注册模块(新的QuartzAutofacJobsModule(typeof(ConvertOrdersJob.Assembly));
    builder.RegisterType().AsSelf();
    var container=builder.Build();
    配置调度器(容器);
    config.DependencyResolver=新的AutoFacWebApidencyResolver(容器);
    ...
    专用静态void配置调度器(IContainer容器)
    {
    var scheduler=container.Resolve();
    scheduler.Start();
    }
    
    在AutofacRepositoryModule中注册存储库:

    公共类AutofacRepositoryModule:模块
    {
    受保护的覆盖无效负载(ContainerBuilder builder)
    {
    ...
    builder.RegisterType().As();
    ...
    }
    }
    
    配置作业:

    公共类作业调度器
    {
    专用IScheduler\u调度器;
    公共作业调度程序(ISScheduler调度程序)
    {
    _调度程序=调度程序;
    }
    公开作废开始()
    {
    //BUG1:找出为什么cleanupDumpsTrigger从未开火
    //BUG2:通过构造函数进行依赖项注入不起作用
    var cleanupDumpsJob=JobBuilder.Create().Build();
    var cleanupDumpsTrigger=TriggerBuilder.Create()
    .WithIdentity(“清理转储程序”、“转储”)
    .StartNow()
    .使用SimpleSchedule(x=>x
    .间隔时间(24小时)
    .RepeatForever())
    .Build();
    _ScheduleJob(cleanupDumpsJob,cleanupDumpsTrigger);
    var convertOrdersJob=JobBuilder.Create().Build();
    var convertOrdersTrigger=TriggerBuilder.Create()
    .WithIdentity(“ConvertOrdersTrigger”、“orders”)
    .StartNow()
    .使用SimpleSchedule(x=>x
    .间隔小时(1)
    .RepeatForever())
    .Build();
    _ScheduleJob(convertOrdersJob,convertOrdersTrigger);
    _scheduler.Start();
    }
    
    工作示例:

    [不允许继续执行]
    公共类转储清理作业:IJob
    {
    私有只读IDumpReportRepository\u dumpReportRepository;
    公共转储CleanupJob(IDumpReportRepository dumpReportRepository)
    {
    //错误:从未调用构造函数
    _dumpReportRepository=dumpReportRepository;
    }
    public void Execute(IJobExecutionContext上下文)
    {
    尝试
    {
    ...
    }
    捕获(例外情况除外)
    {
    ...
    }
    }
    }
    
    版本:

    我尝试了很多版本的Quartz(2.x-3.x)/Autofac.Extras.Quartz(3.x-4.0.0)

    解决方法

    临时解决办法:

  • 取消使用Autofac.Extras.Quartz
  • 所有依赖项都是在无参数构造函数中创建的
  • 默认调度程序用于配置所有作业(所有作业都已正确启动)

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

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

    scheduler.JobFactory = new JobFactoryInjection(container);
    

    在提供的代码中没有向DI容器注册组件的
    IDumpReportRepository
    ,Autofac不会自动扫描程序集以进行类型注册。您是否有类似于
    builder.RegisterInstance(new DumpReportRepository()).As();
    或通过程序集扫描:
    builder.RegisterAssemblyTypes(您的程序集).Where(t=>t.Name.EndsWith(“存储库”)).AsImplementedInterfaces();
    ?谢谢,我更新了代码(显示存储库注册)@set您尝试过类似的方法吗?您仍然存在此问题吗?