我需要向所有用户发送每日摘要电子邮件,但是我不确定应该在何处触发它。
我上了发送电子邮件的类(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
很可能已注册为作用域。