繁体   English   中英

使用loc在HangFire中实施定期作业

[英]Implement recurring Jobs in HangFire using loc

我有我想设置周期性工作的webApi。 我应该把代码放在哪里? 另外,由于我使用的是SimpleInjector,我如何获得执行该方法所需的服务?

目前我有扩展方法来像这样设置HangFire

public static IApplicationBuilder UseHangFireServer(this IApplicationBuilder builder, Container container, BackgroundJobServerOptions options, JobStorage storage)
{
    if (builder == null) throw new ArgumentNullException("builder");
    if (options == null) throw new ArgumentNullException("options");
    if (storage == null) throw new ArgumentNullException("storage");

    var server = new BackgroundJobServer(options, storage);
    var lifetime = builder.ApplicationServices.GetRequiredService<IApplicationLifetime>();
    lifetime.ApplicationStopped.Register(server.Dispose);

    RecurringJob.AddOrUpdate("run-triggers", () => { "HERE I NEED A SERVICE, USING SIMPLE INJECTOR?" }, Cron.Hourly);

    return builder;
}

我试过使用这个

RecurringJob.AddOrUpdate("run-triggers", () => container.GetInstance<IMyService>().Run(), Cron.Hourly);

但是我收到错误消息说

IMyService已注册为“执行上下文作用域”的生活方式,但是在执行上下文作用域的上下文之外请求了实例。

我也尝试过

RecurringJob.AddOrUpdate("trigger-queue", () => builder.ApplicationServices.GetService<IMyService>().Queue(), Cron.Hourly);

但这返回null。

看来您需要为Hangfire设置新的作业激活器,以便它可以提供依赖项。 (默认值将不处理依赖项)。

您可以使用已经编写的简单注入器激活器: https : //www.nuget.org/packages/HangFire.SimpleInjector (或查看源代码并自己编写)

然后,您可以查看它以进行设置(设置传递给作业服务器的选项实例的activator属性): http : //docs.hangfire.io/en/latest/background-methods/using-ioc-containers .html

(不确定这些外部链接是否正常,我觉得如果它们从互联网上消失了,那么Hangfire也可能会被取消)。

现在,您可以为您的定期工作创建一个类,然后Hangfire将使用激活器为您的构造函数提供依赖项。

IE浏览器:

class SomeJob {

    myDependency _param1;

    public SomeJob(myDependency param1) {
        _param1 = param1;
    }

    void ExecuteTask() {
        _param1.DoStuff();
    }
}

那么你也能:

RecurringJob.AddOrUpdate((j)=> j.Execute(),Cron.Hourly);

Hangfire将使用type参数创建类的实例,使用简单的注入器将依赖项提供给ctor,然后它将执行您的工作。

希望有用

史蒂夫

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM