C#.NET MVC 4 - 如何创建使用Ninject服务石英工作?(c# .NET MVC 4

2019-10-21 19:16发布

我使用.NET MVC 4.所有的服务都使用Ninject注入。 我试图安排使用Quartz工作。 眼下,就业登记在Global.asax ,如下所示:

Global.asax

protected void Application_Start() {
    // ... configuration stuff

    ScheduledJobs.RegisterJobs();
}

ScheduleJobs.csScheduledJobs类,它与触发器创造就业机会,并将它们添加到一个标准的时间表。

ScheduleJobs.cs

public class ScheduledJobs {

  public static void RegisterJobs() {
    IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler();

    scheduler.Start();

    IJobDetail job = JobBuilder.Create<JobUsingService>()
        .WithIdentity("JobUsingService")
        .Build();

    ITrigger trigger = TriggerBuilder.Create()
        .WithDailyTimeIntervalSchedule(s =>
            s.WithIntervalInHours(1)
            .OnEveryDay()
            .StartingDailyAt(new Quartz.TimeOfDay(DateTime.Now.Hour, DateTime.Now.Minute)))
        .Build();

    scheduler.ScheduleJob(job, trigger);
  }
}

这是工作的代码:

public class JobUsingService : IJobUsingService, IJob {

   private ISomeService someService;

   public JobUsingService(ISomeService _someService) {
       someService = _someService;
   }

   public void Execute(IJobExecutionContext context) {
       someService.someStuff();
   }
}

的问题是, JobUsingService必须使用Ninject被初始化,使得SomeService注入到它(也由Ninject)。 主叫IJobDetail job = JobBuilder.Create<JobUsingService>().WithIdentity("JobUsingService").Build(); 跳过了Ninject注入和不注入必要的服务创建一个类的实例定期。

如何创建类型的工作JobUsingService使用Ninject?

这个所谓的答案建议创建一个NinjectJobFactory ,但我不知道如何实际使用这个工厂和创造就业机会。

Answer 1:

是的,你将不得不使用NinjectJobFactory中的参考答案 。 在应用程序初始化程序( Application_Start ,或任何你配置应用程序使用ninject刚过创建内核),你必须做的:

Quartz.IScheduler.JobFactory = kernel.Get<NinjectJobFactory>();

或可替换地:

Quartz.IScheduler.JobFactory = new NinjectJobFactory(kernel);

(并不重要,他们是完全互换)

从此Quarty将创建作业类型( JobUsingService使用NinjectJobFactory其轮流使用kernel创建工作...



Answer 2:

最后,我们需要添加描述的NinjectJobFactory类此SO答案

我们还必须做如下修改:

ScheduleJobs.cs

public class ScheduledJobs {

    public static void RegisterJobs() {
        // Create a new kernel and create the necessary bindings
        IKernel kernel = new StandardKernel();
        kernel.Bind<IJobUsingService>().To<JobUsingService>();

        // Create a scheduler and give it the Ninject job factory created earlier
        IScheduler scheduler = new StdSchedulerFactory().GetScheduler();
        scheduler.JobFactory = new NinjectJobFactory(kernel);

        // Create the job with the interface which will be injected
        IJobDetail job = JobBuilder.Create<IJobUsingService>()
             .WithIdentity("IJobUsingService")
             .Build();

         // Create the trigger
         ITrigger trigger = TriggerBuilder.Create()
             .WithDailyTimeIntervalSchedule(s =>
                 s.WithIntervalInHours(23)
                  .OnEveryDay()
                  .StartingDailyAt(new Quartz.TimeOfDay(DateTime.Now.Hour, DateTime.Now.Minute)))
             .Build();

         scheduler.ScheduleJob(job, trigger);
    }
}


文章来源: c# .NET MVC 4 - How do I create Quartz jobs that use Ninject services?