2017-05-30 227 views
4

我目前有一个简单的网站设置与ASP.NET核心MVC(.NET 4.6.1),我想定期做一些过程,如自动发送电子邮件在每当天给注册会员。使用FluentScheduler - ASP.NET核心MVC

经过一番搜索,我遇到了两个常见的解决方案 - Quartz.NET和FluentScheduler。

基于此SO thread,我发现使用FluentScheduler更容易消化和使用我的简单任务的方法。在我的Program.cs类中快速实现了以下几行代码后,我每分钟都会成功发送电子邮件(用于测试目的)。

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var host = new WebHostBuilder() 
      .UseKestrel() 
      .UseContentRoot(Directory.GetCurrentDirectory()) 
      .UseIISIntegration() 
      .UseStartup<Startup>() 
      .Build(); 

      var registry = new Registry(); 
      JobManager.Initialize(registry); 

      JobManager.AddJob(() => MyEmailService.SendEmail(), s => s 
        .ToRunEvery(1) 
        .Minutes()); 

      host.Run(); 

    } 
} 

但是,除了发送电子邮件之外,我还需要为例如电子邮件地址做一些后端处理。邮件发送时更新数据库中的用户记录。为此,我通常将我的实体框架上下文注入到我的控制器的构造函数中,并使用它来获取/更新SQL记录。

我的问题是,因为我不能真正将这些服务注入主方法,在哪里将适当的位置初始化注册表并添加作业调度?

感谢您的帮助,我对此有点新,所以一点指导将非常感谢!

回答

0

您可以通过从FluentScheduler Registry类继承来定义所有作业及其时间表。是这样的:

public class JobRegistry : Registry { 

    public JobRegistry() { 
     Schedule<EmailJob>().ToRunEvery(1).Days(); 
     Schedule<SomeOtherJob>().ToRunEvery(1).Seconds(); 
    } 

} 

public class EmailJob : IJob { 

    public DbContext Context { get; } // we need this dependency, right?! 

    public EmailJob(DbContext context) //constructor injection 
    { 
     Context = context; 
    } 

    public void Execute() 
    { 
     //Job implementation code: send emails to users and update database 
    } 
} 

对于注入依赖成工作,需要实现FluentScheduler IJobFactory接口。 GetJobIntance方法由FluentScheduler调用以创建作业实例。在这里你可以使用任何你想要的DI库;在此示例实现,我会假设你使用Ninject:

通过调用
public class MyNinjectModule : NinjectModule { 
    public override void Load() 
    { 
     Bind<DbContext>().To<MyDbContextImplemenation>(); 
    } 
} 

public class JobFactory : IJobFactory { 

    private IKernel Kernel { get; } 

    public JobFactory(IKernel kernel) 
    { 
     Kernel = kernel; 
    } 

    public IJob GetJobInstance<T>() where T : IJob 
    { 
     return Kernel.Get<T>(); 
    } 
} 

现在你可以开始在main方法作业:

JobManager.JobFactory = new JobFactory(new StandardKernel(new MyNinjectModule())); 
JobManager.Initialize(new JobRegistry());