首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用FluentScheduler - ASP.NET核心MVC

使用FluentScheduler - ASP.NET核心MVC
EN

Stack Overflow用户
提问于 2017-05-30 19:04:04
回答 2查看 6.9K关注 0票数 9

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

在做了一些搜索之后,我发现了两种常见的解决方案- Quartz.NET和FluentScheduler。

基于这个SO thread,我发现使用FluentScheduler的方法更容易理解和使用来完成我的简单任务。在将以下几行代码快速实现到我的Program.cs类中之后,我每分钟都能成功地发送电子邮件(用于测试目的)。

代码语言:javascript
复制
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方法,那么哪里才是初始化注册表和添加调度作业的合适位置呢?

谢谢你的帮助,我对此有点新手,所以一点指导将不胜感激!

EN

回答 2

Stack Overflow用户

发布于 2018-05-30 20:08:24

在app.UseMvc之前,我在Startup.cs中初始化了这个函数,而不是程序的Main函数。

代码语言:javascript
复制
public void Configure(...., IDependencyObject dependencyObject)
{
           ....
           JobManager.Initialize(new MyRegistry(dependencyObject));

            app.UseMvc(routes =>
            {
                routes.MapRoute(
                    name: "default",
                    template: "api/{controller}/{action}/{id?}");
            });
}

我的注册表类如下所示:

代码语言:javascript
复制
public class MyRegistry: Registry
{
    public MyRegistry(IDependencyObject dependencyObject)
    {            
        Schedule(() => new SyncUpJob(dependencyObject)).ToRunNow().AndEvery(10).Seconds();
    }
}

我的Job类如下所示:

代码语言:javascript
复制
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
    }
}
票数 4
EN

Stack Overflow用户

发布于 2017-10-19 20:33:26

您可以通过从FluentScheduler Registry类派生子类来定义所有作业及其调度。类似于:

代码语言:javascript
复制
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接口。FluentScheduler调用GetJobIntance方法来创建作业实例。在这里,您可以使用任何您想要的DI库;在这个示例实现中,我将假设您使用的是Ninject:

代码语言:javascript
复制
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方法中启动作业:

代码语言:javascript
复制
JobManager.JobFactory = new JobFactory(new StandardKernel(new MyNinjectModule()));
JobManager.Initialize(new JobRegistry());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44260493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档