2011-07-19 22 views

Respuesta

20

Crear un JobFactory que utiliza Ninject

public class NinjectJobFactory : IJobFactory 
{ 
    private readonly Func<Type, IJob> jobFactory; 

    public NinjectJobFactory (Func<Type, IJob> jobFactory) 
    { 
     this.jobFactory = jobFactory; 
    } 

    public IJob NewJob(TriggerFiredBundle bundle) 
    { 
     return this.jobFactory(bundle.JobDetail.JobType); 
    } 
} 

y una QuarzSchedulerProvider

public class QuartzSchedulerProvider : Provider<IScheduler> 
{ 
    private readonly IJobFactory jobFactory; 
    private readonly IEnumerable<ISchedulerListener> listeners; 
    private readonly ISchedulerFactory schedulerFactory; 

    public QuartzSchedulerProvider(
     ISchedulerFactory schedulerFactory, 
     IJobFactory jobFactory, 
     IEnumerable<ISchedulerListener> listeners) 
    { 
     this.jobFactory = jobFactory; 
     this.listeners = listeners; 
     this.schedulerFactory = schedulerFactory; 
    } 

    protected override IScheduler CreateInstance(IContext context) 
    { 
     var scheduler = this.schedulerFactory.GetScheduler(); 
     scheduler.JobFactory = this.jobFactory; 
     foreach (var listener in this.listeners) 
     { 
      scheduler.AddSchedulerListener(listener); 
     } 

     return scheduler; 
    } 
} 

y una SchedulerFactoryProvider

public class QuartzSchedulerFactoryProvider : Provider<ISchedulerFactory> 
{ 
    protected override ISchedulerFactory CreateInstance(IContext context) 
    { 
     var properties = new NameValueCollection(); 
     properties["quartz.dataSource.DataSource.connectionString"] = "Your connection string"; 
     properties["quartz.dataSource.DataSource.provider"] = "Your provider"; 

     properties["quartz.jobStore.type"] = "Quartz.Impl.AdoJobStore.JobStoreTX, Quartz"; 
     properties["quartz.jobStore.driverDelegateType"] = "Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz "; 
     properties["quartz.jobStore.tablePrefix"] = "QRTZ_"; 
     properties["quartz.jobStore.dataSource"] = "DataSource"; 
     properties["quartz.jobStore.useProperties"] = "true"; 

     return new StdSchedulerFactory(properties); 
    } 
} 

y configurar

Bind<IJobFactory>().To<NinjectJobFactory>(); 
Bind<ISchedulerFactory>().ToProvider<QuartzSchedulerFactoryProvider>(); 
Bind<IScheduler>().ToProvider<QuartzSchedulerProvider>().InSingletonScope(); 
Bind<Func<Type, IJob>>().ToMethod(ctx => t => (IJob)ctx.Kernel.Get(t)); 

Si necesita ISchedulerListener p. Ej. para el registro, únelos aquí también.

Inyecte una instancia de IScheduler donde desee agregar Trabajos y lo más probable es que también tenga que realizar la inyección de propiedad de una instancia en global.asax. Pero tenga en cuenta que aún no he usado Quarz en contexto MVC ya que creo que las tareas programadas no pertenecen a una aplicación web sino a un servicio que se ejecuta en el mismo servidor.

+0

Muchas gracias Remo :), permítanme probarlo –

+0

@Remo: si this.ResolutionRoot en la parte superior, ¿es this.kernel o tenía la intención de cambiar el nombre de la var? (¿O algo de ResolutionRoot está en IJobFactory?) –

+0

Sí, tienes razón. No cambié el nombre de todo cuando lo copié de mi solución. Normalmente uso IResolutionRoot en lugar de IKernel. –