我想每小时更新一次数据库中的数据。所以,我找到了很好的FluentScheduler库并创建了我的IJob
:
public class InfoLoader : IJob
{
private readonly DataContext _db;
public InfoLoader(DataContext db)
{
_db = db;
}
public void Execute()
{
foreach (User user in _db.Users.ToList())
{
foreach (Info i in user.Info.ToList())
{
UpdateInfo(i);
}
}
}
private void UpdateInfo(Info info)
{
// do some operations to update information in db
}
}
当然,我创建了Registry
实现来安排我需要的所有任务:
public class LoadersRegistry : Registry
{
public LoadersRegistry()
{
Schedule<InfoLoader>().ToRunNow().AndEvery(1).Hours();
}
}
另外,我在Program.cs文件中添加以下代码以初始化调度程序并启动它:
JobManager.JobException += (obj) => { logger.LogError(obj.Exception.Message); };
JobManager.Initialize(new LoadersRegistry());
但是当我运行我的应用程序时,我看到以下错误:
我了解LoadersRegistry
无法创建InfoLoader
的实例(在JobManger
期间Program.cs
初始化它),因为InfoLoader
收到DataContext
}。但我不能不接收DataContext
,因为我需要它来在我的数据库中添加数据。
不幸的是我无法找到解决此问题的方法。
感谢您的帮助。
P.S。我读到了using FluentScheduler in asp.net core,但是这个库的开发人员因will not be available in the future而说这个功能this,所以我仍然不知道如何解决这个问题。
答案 0 :(得分:2)
根据API文档,您必须更改注册方式。 以下只是一种方法。
public LoadersRegistry()
{
var dataContext = new DataContext();
Schedule(()=> new InfoLoader(dataContext)).ToRunNow().AndEvery(1).Hours();
}
这里我正在做新的DataContext(),但只要你用它来创建InfoLoader就可以使dataContext可用。
答案 1 :(得分:1)
如果有人会遇到类似的问题,这就是帮助我的解决方案:
您只需要在Startup.cs
文件中进行初始化:
public void ConfigureServices(IServiceCollection services)
var provider = services.BuildServiceProvider();
JobManager.Initialize(new LoadersRegistry(
provider.GetRequiredService<DataContext>()
));
services.AddMvc();
}
当然,LoadersRegistry
应该收到DataContext
个实例,而InfoLoader
应该在构造函数中接收此实例:
public LoadersRegistry(DataContext db)
{
Schedule(new InfoLoader(db)).ToRunNow().AndEvery(30).Seconds();
}
祝你好运! :)