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

Ban*_*San 7 .net quartz-scheduler quartz.net

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

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

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

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

public class MyJob : IJob
{
    private readonly IFoo _foo;

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

        public void Execute(IJobExecutionContext context)
        {
            foo.GetCurrentState();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Bac*_*cks 15

你需要使用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)
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

并使用它:

var _scheduler = schedulerFactory.GetScheduler();
var _scheduler.JobFactory = new IntegrationJobFactory(container);
Run Code Online (Sandbox Code Playgroud)

  • @BanksySan你能接受这个答案吗? (4认同)