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()实例化服务的方法?
什么是最好的方法来做到这一点?
您需要做的就是注册工作(在调用之后的某个地方UseHangfireServer),如下所示:
RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), Cron.Daily);
Run Code Online (Sandbox Code Playgroud)
已经services.AddHangfire注册了特殊的操作JobActivator,它不仅可以解析来自 asp.net core DI 容器的作业实例,还可以为每个作业创建新的范围,这对于您的情况很重要,因为您很可能MyDbContext已注册为范围。
| 归档时间: |
|
| 查看次数: |
1046 次 |
| 最近记录: |