目前不支持直接在使用 Autofac.Extras.Quartz 的项目中配置 Quartz 属性。可以通过自定义 Quartz 属性注入器实现。
示例代码:
1.自定义属性注入器
public class AutofacJobFactory : IJobFactory { private readonly IContainer _container;
public AutofacJobFactory(IContainer container)
{
_container = container;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
var jobDetail = bundle.JobDetail;
var jobType = jobDetail.JobType;
try
{
return _container.Resolve(jobType) as IJob;
}
catch(Exception ex)
{
throw new SchedulerException($"Problem while instantiating job '{jobDetail.Key}' from the AutofacJobFactory.", ex);
}
}
public void ReturnJob(IJob job)
{
}
}
2.注册AutofacJobFactory
// 注册 AutofacJobFactory
builder.Register(c => new AutofacJobFactory(c.Resolve
3.注册作业
// This uses the Quartz.Server assembly to find jobs via attributes. JobInitializer.InitializeJobs(typeof(MyJob).Assembly);
4.作业初始化
public static class JobInitializer
{
public static void InitializeJobs(Assembly assembly)
{
var jobs = from type in assembly.GetTypesWithAttribute
foreach (var jobData in jobs)
{
var jobDetail = CreateJobDetail(jobData.Type, jobData.Attribute);
var trigger = CreateTrigger(jobData.Attribute);
var jobSchedule = new JobSchedule(jobDetail, trigger);
// 注册 Autofac 流程
var builder = new ContainerBuilder();
builder.Register(c => jobDetail.JobType).InstancePerDependency();
builder.RegisterType().As().InstancePerDependency();
builder.RegisterType(jobData.Type).AsSelf().InstancePerDependency();
builder.Update(ContainerProvider.Container);
// 安排作业
var scheduler = ContainerProvider.Container.Resolve();
scheduler.ScheduleJob(jobDetail, trigger);
}
}
private static IJobDetail CreateJobDetail(Type jobType, JobAttribute attribute)
{
var jobDetail = JobBuilder
.Create(jobType)
.WithIdentity(Guid.NewGuid().ToString())
.WithDescription(attribute.Description)
.Build();
if (!string.IsNullOrWhiteSpace(attribute.Group))
jobDetail.Key = new JobKey(jobDetail.Key.Name, attribute.Group);
return jobDetail;
}
private static ITrigger CreateTrigger(JobAttribute attribute)
{
return TriggerBuilder
.Create()
.WithIdentity(attribute.TriggerName)
.WithDescription(attribute.TriggerDescription)
.WithCronSchedule(attribute.CronExpression)
.Build();
}
}