7

I use ninject and quartz.net in my application and I want to inject job with ninject,But I do not know how to ,because all I know is that jobdetail is created by class of Jobimpl instead of an instance,such as:

JobBuilder.Create<SomeJob>()

Does anyone know how?

Charles
  • 50,943
  • 13
  • 104
  • 142
TommyLike
  • 1,010
  • 11
  • 20

1 Answers1

10

You'll have to implement an Quartz.Spi.IJobFactory - which uses an IResolutionRoot to create the job (see below for implementation). Then configure the scheduler to use it: Quartz.IScheduler.JobFactory = kernel.Get<NinjectJobFactory>(); (or, alternatively: Quartz.IScheduler.JobFactory = new NinjectJobFactory(kernel);)


public class NinjectJobFactory : IJobFactory
{
    private readonly IResolutionRoot resolutionRoot;

    public NinjectJobFactory(IResolutionRoot resolutionRoot)
    {
        this.resolutionRoot = resolutionRoot;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        return (IJob)this.resolutionRoot.Get(bundle.JobDetail.JobType);
    }

    public void ReturnJob(IJob job)
    {
        this.resolutionRoot.Release(job);
    }
}
BatteryBackupUnit
  • 12,934
  • 1
  • 42
  • 68
  • `Quartz.IScheduler.JobFactory = *new* NinjectJobFactory()` makes more sense – stuartd Sep 18 '14 at 00:05
  • yeah maybe. But i think it's rather along the lines of `Quartz.IScheduler.JobFactory = kernel.Get()` or you let the `NinjectJobFactory` be injected.. that's why I left it out ;-) – BatteryBackupUnit Sep 18 '14 at 04:25