2017-05-30 240 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());