我正在使用C#Quartz.Net创建一个预定作业,并使用TopShelf将其作为Windows服务。
如果类包含参数化构造函数,则不会执行计划作业。我正在使用Unit for Dependency Injection。
任何人都可以帮我解决问题吗?
以下是示例代码:
class Program
{
static void Main(string[] args)
{
ISchedulerFactory factory = new StdSchedulerFactory();
IScheduler scheduler = factory.GetScheduler();
scheduler.Start();
IJobDetail job = JobBuilder.Create<SimpleJob>()
.WithIdentity("job1", "group1")
.Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity("trigger1", "group1")
.WithSchedule(CronScheduleBuilder.CronSchedule("0/5 * * * * ?"))
.Build();
scheduler.ScheduleJob(job, trigger);
}
}
public class SimpleJob : IJob
{
public SimpleJob(IRepository repo) { } //If i comment out this line, then it works.
public void Execute(IJobExecutionContext context)
{
Console.WriteLine("Hello, JOb executed");
Console.ReadLine();
}
}
由于
答案 0 :(得分:2)
此接口的实例必须具有公共无参数构造函数
通过定义构造函数,编译器假定您不再需要默认构造函数。
这个特殊构造函数有什么意义? (它不会被Quartz使用。)
如果你需要这个构造函数用于其他目的,那么你还需要显式包含Quartz可以使用的默认构造函数。
答案 1 :(得分:1)
我们能够通过我们自己的JobFactory实现上面提到的这个。我们希望将我们的工作视为使用IOC实现的任何其他类来提供作业所需的依赖关系。
以下是我们的实施:
public class ContainerJobFactory : PropertySettingJobFactory
{
private readonly IContainer container;
public ContainerJobFactory(IContainer container)
{
this.container = container;
}
public override IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
var job = container.GetInstance(bundle.JobDetail.JobType);
if (ReferenceEquals(job, null))
return base.NewJob(bundle, scheduler);
SetObjectProperties(job, bundle.JobDetail.JobDataMap);
return (IJob) job;
}
}
以下是我们插入JobFactory的方式:
scheduler.JobFactory = new ContainerJobFactory(StaticContainer.Instance);
await scheduler.Start();
答案 2 :(得分:0)
简短的回答是Quartz.Net需要一个无参数的构造函数。那是那个。
因为你看起来像是想要INJECT,所以这是我收藏的一篇文章。
http://blog.goyello.com/2009/09/21/how-to-use-quartz-net-in-pro-way/
关键信息行是
&#34;您可能想要创建自己的JobFactory实现来完成诸如让应用程序的IoC或DI容器生成/初始化作业实例之类的事情。&#34;