C# 使用hang fire和ASP.NET Core发送每日摘要电子邮件
我需要向所有用户发送每日摘要电子邮件,但我不确定应该在哪里触发它 我已经为发送电子邮件上了一堂课:C# 使用hang fire和ASP.NET Core发送每日摘要电子邮件,c#,asp.net-core,hangfire,C#,Asp.net Core,Hangfire,我需要向所有用户发送每日摘要电子邮件,但我不确定应该在哪里触发它 我已经为发送电子邮件上了一堂课: public class SummaryEmailBusiness { private MyDbContext _db; private IEmailSender _emailSender; public SummaryEmailBusiness(MyDbContext db, IEmailSender emailSender) { _db = d
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>();
现在我被卡住了。Hang fire医生说我需要做以下事情:
RecurringJob.AddOrUpdate(() => SendAllSummaries() , Cron.Daily);
我不知道如何做到这一点,以使类在注入依赖服务的情况下启动。如何引用实例化服务的SendAllSummaries()
方法
最好的方法是什么?您只需注册作业(在调用
UseHangfireServer
后的某个地方),如下所示:
RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), Cron.Daily);
RecurringJob.AddOrUpdate(x=>x.SendAllSummaries(),Cron.Daily);
正在执行
services.AddHangfire
已注册特殊的JobActivator
,它不仅从asp.net core DI容器解析作业实例,而且还为每个作业创建新的作用域,这在您的情况下很重要,因为您的MyDbContext
很可能已注册为作用域。Hangfire正在使用CRON表达式。Cron.Daily是Cron表达式“0***”的简写,它在每天午夜运行。如果您想在一天中的其他时间运行它,例如上午6点,您可以
RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), "0 6 * * *");
RecurringJob.AddOrUpdate(x=>x.SendAllSummaries(),“0.6***”);
阅读更多关于我是否在ConfigureServices()中调用它的信息?我尝试并获得了
JobStorage.Current属性值尚未初始化。您必须在使用Hangfire客户端或服务器API之前进行设置
。我尝试设置JobStorage.Current=newsqlserverstorage(“DefaultConnection”)
但它给出了连接字符串的错误(我用来注册我的db上下文的同一个连接字符串,可以正常工作)@Guerrilla您需要在app.UseHangfireServer()之后的某个时间调用它。所以,至少在Configure
中,而不是在ConfigureServices
中。啊,非常酷。我现在可以在仪表板中看到任务。非常感谢你的帮助!啊,那好多了。谢谢你花时间指出这一点。
RecurringJob.AddOrUpdate<SummaryEmailBusiness>(x => x.SendAllSummaries(), "0 6 * * *");