【问题标题】:Using FluentScheduler - ASP.NET Core MVC使用 FluentScheduler - ASP.NET Core MVC
【发布时间】:2018-05-30 20:08:23
【问题描述】:

我目前有一个使用 ASP.NET Core MVC (.NET 4.6.1) 的简单网站设置,我想定期执行一些流程,例如在每天结束时自动向注册会员发送电子邮件。

经过一番搜索,我发现了两个常见的解决方案——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 记录。

我的问题是,由于我不能真正将这些服务注入到 main 方法中,那么哪里是初始化注册表和添加作业以进行调度的合适位置?

感谢您的帮助,我对此有点陌生,因此非常感谢您提供一些指导!

【问题讨论】:

    标签: asp.net-core-mvc fluentscheduler


    【解决方案1】:

    我在 App.UseMvc 之前在 Startup.cs 中初始化了相同的函数,而不是 Program 的 Main 函数。

    public void Configure(...., IDependencyObject dependencyObject)
    {
               ....
               JobManager.Initialize(new MyRegistry(dependencyObject));
    
                app.UseMvc(routes =>
                {
                    routes.MapRoute(
                        name: "default",
                        template: "api/{controller}/{action}/{id?}");
                });
    }
    

    我的注册表类如下所示:

    public class MyRegistry: Registry
    {
        public MyRegistry(IDependencyObject dependencyObject)
        {            
            Schedule(() => new SyncUpJob(dependencyObject)).ToRunNow().AndEvery(10).Seconds();
        }
    }
    

    我的 Job 类如下所示:

    public class SyncUpJob: IJob
    {
        public SyncUpJob(IDependencyObject dependencyObject)
        {
            DependencyObject= dependencyObject;
        }
    
        public IDependencyObject DependencyObject{ get; set; }
    
        public void Execute()
        {
            // call the method to run weekly here
        }
    }
    

    【讨论】:

      【解决方案2】:

      您可以通过从 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());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-12-22
        • 1970-01-01
        • 2022-07-23
        • 2023-03-13
        • 2019-11-02
        • 2022-01-05
        • 1970-01-01
        相关资源
        最近更新 更多