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

Sending a daily summary email with hang-fire and ASP.NET Core

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

我已经制作了一个 class 用于发送电子邮件 :

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()我注册了服务和hangfire:

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

services.AddTransient<SummaryEmailBusiness>();

并在Configure()中添加

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

现在我卡住了。挂火文档说我需要做类似的事情:

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

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

最好的方法是什么?

您需要做的只是像这样注册工作(在调用 UseHangfireServer 之后的某个地方):

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

services.AddHangfire 已经注册了特殊的 JobActivator 它不仅从 asp.net 核心 DI 容器解析作业实例,而且还为每个作业创建新的范围,这对你的情况很重要,因为您的 MyDbContext 很可能已注册为作用域。

Hangfire 使用 CRON 表达式。对于 CRON 表达式“0 0 * * *”,Cron.Daily 是 shorthand,每天午夜是 运行。如果您想 运行 在一天中的其他时间使用它,例如早上 6 点你可以...

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

阅读更多关于 CRON Expressions here