2011-02-05 93 views
12

有沒有人有任何經驗積分autofacQuartz.Net?如果是這樣,那麼最好在哪裏最好控制生命週期管理 - IJobFactory,在IJob的執行中,還是通過事件監聽器?Autofac和Quartz.Net集成


現在,我使用的是自定義的autofac IJobFactory創建IJob實例,但我沒有一個簡單的方法來插入到ILifetimeScope在IJobFactory確保注入任何昂貴的資源在IJob被清理。作業工廠只是創建一個作業的實例並將其返回。這裏是我的想法電流(希望有更好的...)

  • 它看起來像最AutoFac集成莫名其妙地裹ILifetimeScope圍繞他們所創造的工作單元。明顯的蠻力的方式似乎是通過ILifetimeScopeIJob,並有Execute方法創建一個孩子ILifetimeScope並實例化任何依賴關係。這似乎與服務定位器模式有點太接近了,這反過來似乎違背了autofac的精神,但它可能是確保正確處理範圍的最明顯的方式。

  • 我可以插入一些Quartz事件來處理Job執行堆棧的不同階段,並處理那裏的生命週期管理。這可能會做更多的工作,但如果它能更清晰地分離問題,可能值得。

  • 確保一個IJob是圍繞IServiceComponent型,這將做好各項工作的簡單包裝,並要求其爲Owned<T>,或Func<Owned<T>>。我喜歡這個看起來更像autofac,但我不喜歡它對於IJob的所有實現者都不是嚴格可執行的。

回答

12

不知道太多關於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>>(); 

注:lifetime scope將成爲cre作爲ownedJob實例的一部分,在這種情況下其類型爲Owned<SomeJob>SomeJob所需的任何依賴項即InstancePerLifetimeScopeInstancePerDependency將與Owned實例一起創建和銷燬。

+0

感謝您抽出時間回覆。我喜歡這個想法,因爲它是原始問題中我的第三次頭腦風暴的更加明確的版本。還有什麼讓我感到困惑的是,我無法控制一生的範圍。基本上,我想在自己的LifetimeScope中運行每個IJob,幾乎就像WCF服務調用的等價物。不幸的是Quartz`IJobFactory`非常火,忘記了我所能說的,所以如果我真的想要明確的範圍邊界,我不得不深入Quartz監聽器系統。 – 2011-02-07 20:08:41