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

时间:2015-12-08 16:45:10

标签: c# asp.net .net hangfire

我有我的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。

1 个答案:

答案 0 :(得分:0)

看起来您需要为Hangfire设置一个新的作业激活器,以便它可以提供依赖项。 (默认情况下不会处理依赖项。)

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

然后你可以查看它来设置它(设置你传递给作业服务器的options实例的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)=&gt; j.Execute(),Cron.Hourly);

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

希望这很有用

史蒂夫