Есть ли у кого-нибудь опыт интеграции 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.