C# 如果使用Autofac.Extras.Quartz,依赖项注入将不起作用
说明 我读了很多关于如何配置Autofac.Extras.Quartz以添加Autofac集成的文章,但它根本不起作用,我遇到了以下问题:C# 如果使用Autofac.Extras.Quartz,依赖项注入将不起作用,c#,asp.net,.net,quartz.net,C#,Asp.net,.net,Quartz.net,说明 我读了很多关于如何配置Autofac.Extras.Quartz以添加Autofac集成的文章,但它根本不起作用,我遇到了以下问题: 通过构造函数进行依赖项注入不起作用(但如果我添加了无参数构造函数,它将被调用) 仅调用上次注册的作业,在上次作业之前添加的触发器-从不激发 我花了很多时间来弄清楚如何正确地启动它(在我的例子中,这看起来很简单,但不可行),这与我的项目最相关,在我的项目中,人们有同样的问题,但经历它却没有帮助。 感谢您的帮助 代码: 。。。 //配置自动传真 var buil
。。。
//配置自动传真
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)
解决方法
临时解决办法:
如果包不起作用,则将实现自定义AutofacJobFactory。您可以尝试使用自定义IJobFactory创建作业
scheduler.JobFactory = new JobFactoryInjection(container);
在提供的代码中没有向DI容器注册组件的
IDumpReportRepository
,Autofac不会自动扫描程序集以进行类型注册。您是否有类似于builder.RegisterInstance(new DumpReportRepository()).As();
或通过程序集扫描:builder.RegisterAssemblyTypes(您的程序集).Where(t=>t.Name.EndsWith(“存储库”)).AsImplementedInterfaces();
?谢谢,我更新了代码(显示存储库注册)@set您尝试过类似的方法吗?您仍然存在此问题吗?