Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Quartz.net and Ninject: how to bind implementation to my job using NInject

I am actually working in an ASP.Net MVC 4 web application where we are using NInject for dependency injection. We are also using UnitOfWork and Repositories based on Entity framework.

We would like to use Quartz.net in our application to start some custom job periodically. I would like that NInject bind automatically the services that we need in our job.

It could be something like this:

public class DispatchingJob : IJob
{
    private readonly IDispatchingManagementService _dispatchingManagementService;

    public DispatchingJob(IDispatchingManagementService dispatchingManagementService )
    {
         _dispatchingManagementService = dispatchingManagementService ;
    }

    public void Execute(IJobExecutionContext context)
    {
         LogManager.Instance.Info(string.Format("Dispatching job started at: {0}", DateTime.Now));
        _dispatchingManagementService.DispatchAtomicChecks();
        LogManager.Instance.Info(string.Format("Dispatching job ended at: {0}", DateTime.Now));
    }
}

So far, in our NInjectWebCommon binding is configured like this (using request scope):

     kernel.Bind<IDispatchingManagementService>().To<DispatchingManagementService>();

Is it possible to inject the correct implementation into our custom job using NInject ? and how to do it ? I have read already few posts on stack overflow, however i need some advises and some example using NInject.

like image 574
Vannick Avatar asked Dec 14 '22 19:12

Vannick


1 Answers

Use a JobFactory in your Quartz schedule, and resolve your job instance there.

So, in your NInject config set up the job (I'm guessing at the correct NInject syntax here)

// Assuming you only have one IJob
kernel.Bind<IJob>().To<DispatchingJob>();

Then, create a JobFactory: [edit: this is a modified version of @BatteryBackupUnit's answer here]

public class NInjectJobFactory : IJobFactory
{
    private readonly IResolutionRoot resolutionRoot;

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

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        // If you have multiple jobs, specify the name as
        // bundle.JobDetail.JobType.Name, or pass the type, whatever
        // NInject wants..
        return (IJob)this.resolutionRoot.Get<IJob>();
    }

    public void ReturnJob(IJob job)
    {
        this.resolutionRoot.Release(job);
    }
}

Then, when you create the scheduler, assign the JobFactory to it:

private IScheduler GetSchedule(IResolutionRoot root)
{
    var schedule = new StdSchedulerFactory().GetScheduler();

    schedule.JobFactory = new NInjectJobFactory(root);

    return schedule;
}

Quartz will then use the JobFactory to create the job, and NInject will resolve the dependencies for you.

like image 106
stuartd Avatar answered Dec 21 '22 23:12

stuartd