我需要向所有用户发送每日摘要电子邮件,但我不确定应该在哪里触发它。
我发了一封发送电子邮件的课程:
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()
方法?
最好的方法是什么?
答案 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 * * *");