Подтвердить что ты не робот

Интеграция Autofac и Quartz.Net

Есть ли у кого-нибудь опыт интеграции autofac и Quartz.Net? Если да, то где лучше всего управлять пожизненным управлением - IJobFactory, в Execute из IJob или через прослушиватели событий?


В настоящее время я использую собственный autofac IJobFactory для создания экземпляров IJob, но у меня нет простого способа подключиться к ILifetimeScope в IJobFactory для обеспечения любых дорогостоящих ресурсов, которые вводятся в IJob, очищаются. Задание factory просто создает экземпляр задания и возвращает его. Вот мои текущие идеи (надеюсь, есть лучшие...)

  • Похоже, что большинство интеграций AutoFac каким-то образом обертывают ILifetimeScope вокруг единицы работы, которую они создают. Очевидным способом грубой силы является передача ILifetimeScope в IJob и метод Execute создать дочерний элемент ILifetimeScope и создать экземпляры любых зависимостей там. Это кажется слишком близким к шаблону локатора сервисов, который, в свою очередь, противоречит духу autofac, но это может быть самый очевидный способ обеспечить правильную обработку области.

  • Я мог бы подключиться к некоторым событиям кварца, чтобы обрабатывать разные этапы стека выполнения задания и обрабатывать там управление временем жизни. Это, вероятно, будет намного больше работы, но, возможно, стоит того, если будет более чистое разделение проблем.

  • Убедитесь, что IJob является простой оболочкой типа IServiceComponent, который будет выполнять всю работу, и запросить его как Owned<T> или Func<Owned<T>>. Мне нравится, как это, похоже, больше влияет на autofac, но мне не нравится, что он не является строго обязательным для всех разработчиков IJob.

4b9b3361

Ответ 1

Не зная слишком много о Quartz.Net и IJob s, я покажу предложение.

Рассмотрим следующую оболочку работы:

public class JobWrapper<T>: IJob where T:IJob
{
    private Func<Owned<T>> _jobFactory;

    public JobWrapper(Func<Owned<T>> jobFactory)
    {
        _jobFactory = jobFactory;
    }


    void IJob.Execute()
    {
        using (var ownedJob = _jobFactory())
        {
            var theJob = ownedJob.Value;
            theJob.Execute();
        }
    }
}

Учитывая следующие регистрации:

builder.RegisterGeneric(typeof(JobWrapper<>));
builder.RegisterType<SomeJob>();

Теперь задание factory может разрешить эту оболочку:

var job = _container.Resolve<JobWrapper<SomeJob>>();

Примечание: продолжительность жизни будет создана как часть экземпляра ownedJob, который в этом случае имеет тип Owned<SomeJob>. Любые зависимости, требуемые SomeJob, которые InstancePerLifetimeScope или InstancePerDependency будут созданы и уничтожены вместе с экземпляром Owned.