【问题标题】:Use DI with quartz将 DI 与石英一起使用
【发布时间】:2017-09-16 08:12:47
【问题描述】:

这是我的代码,但它不起作用,因为显然,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;
    }
}

【问题讨论】:

  • 你能给我们看看 BbProcessor 的代码吗?
  • public class BbProcessor : IJob { private readonly Repository _repository; public BbProcessor(Repository Repository) { _repository = Repository; }
  • 我认为您还需要一个无参数构造函数。请参阅下面我编辑的答案。
  • 所以我们俩同时解决了这个问题,我已经有了想法,明天会更新解决方案
  • 查看这个将 Quartz 与 Unity 集成的项目:github.com/hbiarge/Quartz.Unity

标签: c# quartz.net


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    • 看起来我需要像这样创建工作:IJobDetail job = JobBuilder.Create&lt;BbProcessor&gt;() .WithIdentity("myJob", "group1") .Build(); 但它仍然使用空构造函数(至少看起来像这样),我需要解决这个问题
    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    相关资源
    最近更新 更多