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

我上了发送电子邮件的类(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();

现在我被困住了。 Hang-fire文档说我需要做类似的事情:
RecurringJob.AddOrUpdate(() =>  SendAllSummaries() , Cron.Daily);

我不确定如何执行此操作,以便使用注入(inject)的依赖服务来初始化该类。如何引用实例化服务的SendAllSummaries()方法?

最好的方法是什么?

最佳答案

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

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

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

10-08 04:35