我有一份工作需要在另一个对象上启动一些方法。我希望能够将它们传递给构造函数中的作业。
环顾四周,似乎实现这一目标的唯一方法是使用一个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();
}
}
}
答案 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);