在.NET Core API应用程序中使用FluentScheduler时出现DependencyInjection问题

时间:2018-02-17 21:08:35

标签: c# asp.net-core dependency-injection .net-core fluentscheduler

我想每小时更新一次数据库中的数据。所以,我找到了很好的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());

但是当我运行我的应用程序时,我看到以下错误:

Running app

我了解LoadersRegistry无法创建InfoLoader的实例(在JobManger期间Program.cs初始化它),因为InfoLoader收到DataContext }。但我不能不接收DataContext,因为我需要它来在我的数据库中添加数据。

不幸的是我无法找到解决此问题的方法。

感谢您的帮助。

P.S。我读到了using FluentScheduler in asp.net core,但是这个库的开发人员因will not be available in the future而说这个功能this,所以我仍然不知道如何解决这个问题。

2 个答案:

答案 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();
}
祝你好运! :)