2011-07-19 8 views

Répondre

20

Créer un JobFactory qui utilise 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); 
    } 
} 

et un 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; 
    } 
} 

et un 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); 
    } 
} 

et configurer

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 vous avez besoin de ISchedulerListener, par ex. pour la journalisation les lier ici aussi.

Injectez une instance de IScheduler dans laquelle vous souhaitez ajouter des tâches et vous devrez très probablement également injecter des propriétés d'une instance dans global.asax. Mais notez que je n'ai pas encore utilisé Quarz dans le contexte MVC car je pense que les tâches planifiées n'appartiennent pas à une application Web, mais plutôt à un service fonctionnant sur le même serveur.

+0

Merci beaucoup Remo :), laissez-moi l'essayer –

+0

@Remo: devrait this.ResolutionRoot près du top être this.kernel ou aviez-vous l'intention de renommer la var? (ou est quelque chose ResolutionRoot dans IJobFactory?) –

+0

Oui, vous avez raison. Je n'ai pas renommé tout quand je l'ai copié de ma solution. J'utilise normalement IResolutionRoot au lieu de IKernel. –