Asp.net-Mvc-3

ASP.Net MVC 3、Ninject 和 Quartz.Net - 如何?

  • July 21, 2011

我現在使用 Ninject 2.2.1.4 和我的 MVC3,我成功配置 Ninject 執行它,但我不知道如何讓 Ninject 在我的 MVC3 中執行 Quartz.Net 有人可以幫忙嗎?

創建一個使用 Ninject 的 JobFactory

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

和一個 Quartz Scheduler Provider

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

和一個 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);
   }
}

並配置

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));

如果您需要一些 ISchedulerListener,例如用於記錄日誌,也將它們綁定在這裡。

在要添加作業的地方注入 IScheduler 實例,並且很可能您也必須將實例的屬性注入到 global.asax 中。但請注意,我還沒有在 MVC 上下文中使用過 Quarz,因為我認為計劃任務不屬於 Web 應用程序,而是屬於在同一台伺服器上執行的服務。

引用自:https://stackoverflow.com/questions/6741599