Есть ли у кого-нибудь опыт интеграции autofac и Quartz.Net? Если да, то где лучше всего управлять пожизненным управлением - IJobFactory, в Execute из IJob или через прослушиватели событий?Autofac и Quartz.Net Integration
Прямо сейчас, я использую пользовательский autofac IJobFactory
для создания IJob
экземпляров, но у меня нет простой способ подключить к ILifetimeScope
в IJobFactory, чтобы обеспечить любые дорогие ресурсы, которые впрыскивают в IJob очищаются. Завод-изготовитель просто создает экземпляр задания и возвращает его. Вот мои текущие идеи (надеюсь, есть лучшие из них ...)
Похоже, большинство AutoFac интеграций каким-то образом обернуть
ILifetimeScope
вокруг единицы работы, которую они создают. Очевидным способом грубой силы является передачаILifetimeScope
вIJob
и методExecute
создать дочерний элементILifetimeScope
и создать экземпляры любых зависимостей там. Это кажется слишком близким к шаблону локатора сервисов, который, в свою очередь, кажется, противоречит духу autofac, но это может быть самый очевидный способ обеспечить правильную обработку области.Я мог подключиться к некоторым событиям кварца, чтобы обрабатывать различные этапы стека выполнения задания и управлять им в течение жизни. Вероятно, это будет намного больше работы, но, возможно, стоит того, если будет более чистое разделение проблем.
Убедитесь, что IJob простая обертка вокруг
IServiceComponent
типа, который будет делать всю работу, и просить его какOwned<T>
илиFunc<Owned<T>>
. Мне нравится, как это, похоже, больше влияет на autofac, но мне не нравится, что он не является строго обязательным для всех разработчиков IJob.
спасибо, что нашли время, чтобы ответить. Мне нравится идея в том, что это более явная версия моего третьего мозгового штурма в исходном вопросе.Меня все еще беспокоит то, что я не могу контролировать всю жизнь. В принципе, я хотел бы запускать каждый IJob в своем собственном «LifetimeScope», почти как эквивалент вызова службы WCF. Кварц 'IJobFactory', к сожалению, в значительной степени ожесточен и забыл о том, что я смог рассказать, поэтому может случиться так, что, если мне действительно нужны явные границы границ, мне придется заглянуть в систему слушателей кварца. –
@dfaivre - я исправил ошибку в своем коде, я забыл часть 'ownedJob.Value'. Возможно, теперь мои намерения более ясны. –
Я не знал, что Owned создал область; очень полезно. Я думаю, что это, вероятно, самый прямой подход, без глубокого погружения в стек кварца. Я, вероятно, добавлю свой «IJobFactory», чтобы выбросить, если задание не относится к типу 'JobWrapper <>' (просто так я сплю немного лучше ночью). Еще раз спасибо за великолепное понимание. –