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

Gue*_*lla 5 c# hangfire asp.net-core

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

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

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

services.AddTransient<SummaryEmailBusiness>();
Run Code Online (Sandbox Code Playgroud)

并在Configure() 添加

app.UseHangfireDashboard();
app.UseHangfireServer();
Run Code Online (Sandbox Code Playgroud)

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

RecurringJob.AddOrUpdate(() =>  SendAllSummaries() , Cron.Daily);
Run Code Online (Sandbox Code Playgroud)

我不确定如何执行此操作,以便通过注入的依赖服务启动该类。如何引用SendAllSummaries()实例化服务的方法?

什么是最好的方法来做到这一点?

Evk*_*Evk 1

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

RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), Cron.Daily);
Run Code Online (Sandbox Code Playgroud)

已经services.AddHangfire注册了特殊的操作JobActivator,它不仅可以解析来自 asp.net core DI 容器的作业实例,还可以为每个作业创建新的范围,这对于您的情况很重要,因为您很可能MyDbContext已注册为范围。