使用hang-fire和ASP.NET Core发送每日摘要电子邮件

时间:2018-03-26 03:54:10

标签: c# asp.net-core hangfire

我需要向所有用户发送每日摘要电子邮件,但我不确定应该在哪里触发它。

我发了一封发送电子邮件的课程:

public class SummaryEmailBusiness
{
    private MyDbContext _db;
    private IEmailSender _emailSender;

    public SummaryEmailBusiness(MyDbContext db, IEmailSender emailSender)
    {
        _db = db;
        _emailSender = emailSender;
    }

    public void SendAllSummaries()
    {
        foreach(var user in _db.AspNetUsers)
        {
            //send user a summary
        }
    }
}

然后在ConfigureServices()我注册了服务和篝火:

services.AddHangfire(config =>
    config.UseSqlServerStorage(Configuration.GetConnectionString("DefaultConnection")));

services.AddTransient<SummaryEmailBusiness>();

并在Configure()添加了

app.UseHangfireDashboard();
app.UseHangfireServer();

现在我被卡住了。 Hang-fire docs说我需要做类似的事情:

RecurringJob.AddOrUpdate(() =>  SendAllSummaries() , Cron.Daily);

我不知道如何做到这一点,以便在注入依赖服务的情况下启动类。如何引用实例化服务的SendAllSummaries()方法?

最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

您需要做的只是注册工作(在调用UseHangfireServer之后的某个地方),如下所示:

RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), Cron.Daily);

执行services.AddHangfire已经注册了特殊JobActivator,它不仅可以解析来自asp.net核心DI容器的作业实例,还可以为每个作业创建新的作用域,这在您的情况下非常重要,因为很可能您的MyDbContext已注册为作用域。

答案 1 :(得分:1)

Hangfire正在使用CRON表达式。 Cron.Daily是CRON表达式“0 0 * * *”的简写,每天午夜运行。如果你想在一天的另一个时间运行,例如早上6点你可以做...

RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), "0 6 * * *");

详细了解CRON Expressions here