Реализуйте повторяющиеся задания в HangFire, используя 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);

Но это возвращает ноль.


person Gillardo    schedule 08.12.2015    source источник


Ответы (1)


Похоже, вам нужно настроить новый активатор заданий для Hangfire, чтобы он мог предоставлять зависимости. (По умолчанию не обрабатывает зависимости).

Вы можете использовать уже написанный простой активатор инжектора: https://www.nuget.org/packages/HangFire.SimpleInjector (или просмотрите исходный код и напишите свой)

Затем вы можете просмотреть это, чтобы настроить его (установить свойство активатора экземпляра параметров, который вы передаете на сервер заданий): 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, после чего он выполнит вашу работу.

Надеюсь, что это полезно

Стив

person Steve    schedule 13.12.2015
comment
Полный рабочий пример был бы полезен. Вы ссылаетесь на две ссылки и предоставляете только фрагмент кода. Можно подумать, что вы пишете файлы справки для Amazon AWS или что-то в этом роде. - person Kevingy; 19.08.2020