使用 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
我需要向所有用户发送每日摘要电子邮件,但我不确定应该在何处触发它。
我已经制作了一个 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