DI与石英一起使用

时间:2017-04-19 22:07:33

标签: c# quartz.net

这是我的代码并且它无法正常工作,因为显然需要使用作业构建器创建IJobDetails。有没有办法在构造函数中创建具有外部依赖关系的Job?

var container = new UnityContainer();
container.RegisterType<BbProcessor, BbProcessor>();
IJobDetail jobProcessor = container.Resolve<BbProcessor>() as IJobDetail;

// construct a scheduler factory
ISchedulerFactory schedFact = new StdSchedulerFactory();

// get a scheduler
IScheduler sched = schedFact.GetScheduler();
sched.Start();

ITrigger trigger = TriggerBuilder.Create()
                    .StartNow()
                    .WithSimpleSchedule(x => x
                        .WithIntervalInSeconds(10)
                        .RepeatForever())
                    .Build();

sched.ScheduleJob(jobProcessor , trigger);

演员阵容很糟糕,但这只是我尝试做的一个例子(BbProcessor是给构造函数和我想做的工作依赖的类。)

public class BbProcessor : IJob
{ 
    private readonly Repository _repository;
    public BbProcessor(Repository Repository) 
    { 
        _repository = Repository;
    }
}

2 个答案:

答案 0 :(得分:1)

BbProcessor实现IJob而不是IJobDetail,这就是强制转换失败的原因。您可以使用界面(see here)向Unity注册BbProcessor类,但这不是您真正想要的:

var container = new UnityContainer();
container.RegisterType<IJob, BbProcessor>();
IJob jobProcessor = container.Resolve<IJob>();

实际上,BbProcessor必须有一个无参数构造函数。 See Documentation. 另外,look here有关设置工作的完整示例。

您可以像这样创建一个IJobDetail:

IJobDetail job = JobBuilder.Create<BbProcessor>().WithIdentity("Job BB","Group BB").Build();

JobBuilder不使用已解析的类型。看看这个统一与石英相结合的项目能否为您提供以下内容:https://github.com/hbiarge/Quartz.Unity

答案 1 :(得分:0)

这篇文章给了我答案https://stackoverflow.com/a/13857396/4350808(我将同一个实例传递给JobDataMap创建的作业)