Link to home
Start Free TrialLog in
Avatar of verytoothy
verytoothy

asked on

How do I create a Quartz.NET’s job requiring injection with autofac

I am trying to get Quartz.net (2.1.2) to work with an IoC container (autofac), as I have services I need to use in the scheduled jobs. I have found similar posts on the subject, but I can't seem to find one with a specific registration example for autofac.

In the following example, the "HelloJob" will run, but whenever I try to inject the releaseService into the "ReleaseJob" it refuses to run. If I remove the ReleaseService references from the ReleaseJob it will then work.

The part I believe I have wrong is the bindings. I'm not very experienced with them, but I've tried every possible thing I can think of and it just refuses to work.

I marked the code in the DependencyRegistration.cs section where I believe the issue is.

Note that I have also tried getting the scheduler in the DependencyRegistration.cs file with:

//Schedule
IScheduler scheduler = container.Resolve<ISchedulerFactory>().GetScheduler();

...instead of using a new StdSchedulerFactory(), but that doesn't work either.

Update:
Some related links that are related to what I need to do and might help (I've already gone through them all but still cannot figure out how to get it working with autofac):

HOW TO use Quartz.NET in PRO way?
http://blog.goyello.com/2009/09/21/how-to-use-quartz-net-in-pro-way/
Autofac and Quartz.NET
http://blog.humann.info/post/2013/01/30/Autofac-and-QuartzNET.aspx
Constructor injection with Quartz.NET and Simple Injector
http://stackoverflow.com/questions/14562176/constructor-injection-with-quartz-net-and-simple-injector/14562660#14562660
How to schedule task using Quartz.net 2.0?
http://stackoverflow.com/questions/16653178/how-to-schedule-task-using-quartz-net-2-0
ASP.Net MVC 3, Ninject and Quartz.Net - How to?
http://stackoverflow.com/questions/6741599/asp-net-mvc-3-ninject-and-quartz-net-how-to

Here is the relevant code:

Global.asax

protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);

        var dependencyRegistration = new DependencyRegistration();
        dependencyRegistration.Register();

        ModelValidatorProviders.Providers.Clear();
        ModelValidatorProviders.Providers.Add(new FluentValidationModelValidatorProvider(new ValidatorFactory()));

        DataAnnotationsModelValidatorProvider.AddImplicitRequiredAttributeForValueTypes = false;
    }

Open in new window


DependencyRegistration.cs

public class DependencyRegistration
{
    public void Register()
    {
        var builder = new ContainerBuilder();

        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        builder.RegisterAssemblyModules(Assembly.GetExecutingAssembly());

        // Validation
        builder.RegisterType<ValidatorFactory>()
            .As<IValidatorFactory>()
            .InstancePerHttpRequest();

        AssemblyScanner findValidatorsInAssembly = AssemblyScanner.FindValidatorsInAssembly(Assembly.GetExecutingAssembly());
        foreach (AssemblyScanner.AssemblyScanResult item in findValidatorsInAssembly)
        {
            builder.RegisterType(item.ValidatorType)
                .As(item.InterfaceType)
                .InstancePerHttpRequest();
        }

       // Schedule
       builder.Register(x => new StdSchedulerFactory().GetScheduler()).As<IScheduler>();

        // Schedule Jobs
        builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).Where(x => typeof(IJob).IsAssignableFrom(x));
        /*** Scheduler ***/

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        //Schedule
        IScheduler sched = container.Resolve<IScheduler>();
        sched.JobFactory = new AutofacJobFactory(container);
        sched.Start();

        IJobDetail job = JobBuilder.Create<ReleaseJob>()
                .WithIdentity("1Job")
                .Build();

        ITrigger trigger = TriggerBuilder.Create()
            .WithIdentity("1JobTrigger")
            .WithSimpleSchedule(x => x
                .RepeatForever()
                .WithIntervalInSeconds(5)
            )
            .StartNow()
            .Build();

        sched.ScheduleJob(job, trigger);

        job = JobBuilder.Create<HelloJob>()
               .WithIdentity("2Job")
               .Build();

        trigger = TriggerBuilder.Create()
            .WithIdentity("2JobTrigger")
            .WithSimpleSchedule(x => x
                .RepeatForever()
                .WithIntervalInSeconds(5)
            )
            .StartNow()
            .Build();

        sched.ScheduleJob(job, trigger);
    }
}

Open in new window


JobFactory.cs

public class AutofacJobFactory : IJobFactory
{
    private readonly IContainer _container;

    public AutofacJobFactory(IContainer container)
    {
        _container = container;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        return (IJob)_container.Resolve(bundle.JobDetail.JobType);
    }

    public void ReturnJob(IJob job)
    {
    }
}

Open in new window


ReleaseJob.cs

public class ReleaseJob : IJob
{
    private readonly IReleaseService _releaseService;

    public ReleaseJob(IReleaseService releaseService)
    {
        this._releaseService = releaseService;
    }

    public void Execute(IJobExecutionContext context)
    {
        Debug.WriteLine("Release running at " + DateTime.Now.ToString());
    }
}

public class HelloJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Debug.WriteLine("Hello job at " + DateTime.Now.ToString());
    }
}

Open in new window


ReleaseServiceModel.cs

public class ReleaseServiceModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<ReleaseService>()
            .As<IReleaseService>()
            .InstancePerHttpRequest();
    }
}

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of verytoothy
verytoothy

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial