Как получить PerformContext из Hangfire API

В нашем проекте мы используем шаблон aspnetzero. Этот шаблон позволяет простое, но абстрактное использование Hangfire. Теперь мы хотели бы добавить в наш проект Hangfire.Console, что позволит нам записывать логи в приборная панель Hangfires.

Чтобы записать оператор журнала в консоль панели управления, нам необходимо получить доступ к PerformContext текущего запущенного задания. К сожалению, из-за абстракции в aspnetzero мы не можем внедрить PerformContext< /a> как и было запланировано Hangfire. У нас есть доступ к пространству имен Hangfire и всем его статическим объектам.

Поэтому мой вопрос: есть ли способ получить PerformContext другим способом, кроме передачи null методу выполнения?

Что я уже пробовал:

  • При использовании интерфейса IServerFilter следует вызвать метод OnPerforming. Но, к сожалению, это не относится к фоновым заданиям aspnetzero.
  • Я попытался перезаписать/расширить данный базовый класс BackgroundJob‹ T > aspnetzero, но безуспешно. Может кто подскажет в этом направлении.

person marco birchler    schedule 28.08.2019    source источник


Ответы (2)


Я использовал JobFilterAttribute с IServerFilter.

Пример:

[AttributeUsage(AttributeTargets.Class)]
 public class HangFirePerformContextAttribute : JobFilterAttribute, IServerFilter
{
         private static PerformContext _Context;

        public static PerformContext PerformContext
        {
            get
            {
                return new PerformContext(_Context);
            }
        }
        public void OnPerformed(PerformedContext filterContext)
        {
            Context = (PerformContext)filterContext;
            _Context = Context;
        }
        public void OnPerforming(PerformingContext filterContext)
        {
            Context = (PerformContext)filterContext;
            _Context = Context;
        }
}

И я создаю новый класс AsyncBackgroundJobHangFire<TArgs> : AsyncBackgroundJob<TArgs>

Пример:

    [HangFirePerformContext]
    public abstract class AsyncBackgroundJobHangFire<TArgs> : AsyncBackgroundJob<TArgs>
    {
        public PerformContext Context { get; set; }

        protected async override Task ExecuteAsync(TArgs args)
        {
            Context = HangFirePerformContextAttribute.PerformContext;
            await ExecuteAsync(args, Context);
        }

        protected abstract Task ExecuteAsync(TArgs args, PerformContext context);
    }

Это работает

В классе работы я использую AsyncBackgroundJobHangFire

И де метод

        [UnitOfWork]
        protected override async Task ExecuteAsync(string args, PerformContext context)
        {
        }
person Afonso Dutra Nogueira Filho    schedule 23.04.2021

Я также страдал, используя реализацию заданий Hangfire от abp. Я не знаю, как точно ответить на ваш вопрос, но я смог получить доступ к PerformingContext, реализовав атрибут, который расширяет JobFilterAttribute и реализует IClientFilter, IServerFilter, IElectStateFilter, IApplyStateFilter. Интерфейсы будут зависеть от ваших требований, но я смог получить доступ к PerformingContext таким образом.

person Vitor Durante    schedule 04.09.2019
comment
Это было опубликовано как ответ, но он не пытается ответить на вопрос. Возможно, это должен быть комментарий. - person aaron; 05.09.2019
comment
без образца нелегко рассуждать о том, что вы говорите. Скорее всего, это комментарий, а не реальный ответ. - person Junior Mayhé; 08.06.2020