Интеграция Autofac и Quartz.Net - PullRequest
15 голосов
/ 06 февраля 2011

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


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

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

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

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

Ответы [ 2 ]

12 голосов
/ 07 февраля 2011

Не зная слишком много о 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>();

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

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

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

3 голосов
/ 10 апреля 2014

Взгляните на https://github.com/alphacloud/Autofac.Extras.Quartz. Он также доступен в виде пакета NuGet https://www.nuget.org/packages/Autofac.Extras.Quartz/

Я знаю, что немного поздно:)

...