首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在.NET核心应用程序中使用FluentScheduler时出现的DependencyInjection问题

在.NET核心应用程序中使用FluentScheduler时出现的DependencyInjection问题
EN

Stack Overflow用户
提问于 2018-02-18 05:08:35
回答 2查看 1.5K关注 0票数 1

我想每小时更新数据库中的数据。因此,我找到了很好的FluentScheduler库并创建了我的IJob

代码语言:javascript
复制
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实现来调度我需要的所有任务:

代码语言:javascript
复制
public class LoadersRegistry : Registry
{
    public LoadersRegistry()
    {
        Schedule<InfoLoader>().ToRunNow().AndEvery(1).Hours();
    }
}

另外,我在Program.cs文件中添加了以下代码来初始化调度器并启动它:

代码语言:javascript
复制
JobManager.JobException += (obj) => { logger.LogError(obj.Exception.Message); };
JobManager.Initialize(new LoadersRegistry());

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

我知道LoadersRegistry不能创建InfoLoader的实例(在JobMangerProgram.cs中初始化它的过程中),因为InfoLoader接收DataContext。但是我不能不接收DataContext,因为我需要它在我的数据库中添加数据。

不幸的是,我找不到解决这个问题的方法。

谢谢你的帮助。

附注:我读到过关于using FluentScheduler in asp.net core的文章,但是这个库的开发者说这个特性will not be available in the future是因为this,所以我仍然不知道如何解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2018-02-18 15:27:32

根据API文档,您必须更改注册方式。以下只是其中的一种方式。

代码语言:javascript
复制
public LoadersRegistry()
    {
        var dataContext = new DataContext();
        Schedule(()=> new InfoLoader(dataContext)).ToRunNow().AndEvery(1).Hours();
    }

在这里,我正在执行新的DataContext(),但是您可以让dataContext随心所欲地可用,只要您使用它来更新InfoLoader。

票数 2
EN

Stack Overflow用户

发布于 2018-02-18 23:39:06

如果有人会遇到类似的问题,这是对我有帮助的解决方案:

您只需要在Startup.cs文件内部进行初始化:

代码语言:javascript
复制
public void ConfigureServices(IServiceCollection services)
    var provider = services.BuildServiceProvider();

    JobManager.Initialize(new LoadersRegistry(
        provider.GetRequiredService<DataContext>()
    ));

    services.AddMvc();
}

当然,LoadersRegistry应该接收DataContext实例,InfoLoader应该在构造函数中接收这个实例:

代码语言:javascript
复制
public LoadersRegistry(DataContext db)
{
    Schedule(new InfoLoader(db)).ToRunNow().AndEvery(30).Seconds();
}

祝你好运!:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48845952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档