使用几个构造函数参数创建Quartz.NET作业

时间:2015-08-06 16:31:16

标签: .net quartz-scheduler quartz.net

我有一份工作需要在另一个对象上启动一些方法。我希望能够将它们传递给构造函数中的作业。

环顾四周,似乎实现这一目标的唯一方法是使用一个IoC框架。虽然这种方法将来会成为我的解决方案,但现在我需要一个香草解决方案,不需要任何IoC。

我知道JobDataMap,但由于序列化,Best Practices文档建议不要这样做。该对象是多线程和有状态的,因此无论如何序列化将是代码自杀。

如何创建类似于以下的工作:

public class MyJob : IJob
{
    private readonly IFoo _foo;

        public StopMonitoring(IFoo foo)
        {
            _foo = foo;
        }

        public void Execute(IJobExecutionContext context)
        {
            foo.GetCurrentState();
        }
    }
}

1 个答案:

答案 0 :(得分:14)

您需要使用JobFactory:

internal sealed class IntegrationJobFactory : IJobFactory
{
    private readonly IUnityContainer _container;

    public IntegrationJobFactory(IUnityContainer container)
    {
        _container = container;
    }

    public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
    {
        var jobDetail = bundle.JobDetail;

        var job = (IJob)_container.Resolve(jobDetail.JobType);
        return job;
    }

    public void ReturnJob(IJob job)
    {
    }
}

并使用它:

var _scheduler = schedulerFactory.GetScheduler();
var _scheduler.JobFactory = new IntegrationJobFactory(container);