2017-05-30 51 views
4

を私は現在、ASP.NET MVCのコア(.NET 4.6.1)との簡単なウェブサイトを設定している、と私は定期的に、自動的にすべてのの終わりに電子メールを送信するようないくつかのプロセスをやりたいです登録されたメンバーに日。- ASP.NET MVCコア

いくつかの検索を行った後、私はQuartz.NETとFluentSchedulerの2つの一般的なソリューションに出くわしました。この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(); 

    } 
} 

しかし、今のところ電子メールを送信する以外にも、私はいくつかのバックエンド処理を行う必要があります。メールが送信されているときにDB内のユーザーレコードを更新します。このために、私は通常、自分のEntity Framework Contextをコントローラのコンストラクタに挿入し、SQLレコードの取得/更新に使用します。私は本当にレジストリを初期化し、スケジューリングのためのジョブを追加するための適切な場所でしょうmainメソッドの中にこれらのサービスを注入することはできませんので、

私の質問は、ありますか?

助けてくれてありがとう、私は少しこれは少し新しい指導は非常に感謝されるので、少しです!

答えて

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

今、あなたが呼び出すことにより、メイン方法であなたの仕事を始めることができます:

JobManager.JobFactory = new JobFactory(new StandardKernel(new MyNinjectModule())); 
JobManager.Initialize(new JobRegistry()); 
関連する問題