2012-08-08 92 views
1

我有一個現有的C#ASP.NET應用程序,帶有用戶界面和各種按鈕來啓動操作。這些動作對一個單例類進行同步方法調用,我將調用這個類ServiceLayer。該層還初始化數據模型。執行Quartz .NET作業來調用現有的類方法

我想安排UI中的某些操作在一天中的某些時間發生。我相信Quartz.NET提供了我需要的所有必要功能。我可以從每個Job類的Execute(IJobExecutionContext上下文)(即實現IJob接口的類)成功地調用單例類ServiceLayer上的方法。不過,我不喜歡使用這種方法的幾個原因:

  • 難單元測試(例如,我要保證之前,我可以做任何事情的單身初始化)
  • 如果大量的就業機會擴大規模被稱爲
  • 與同時在單例類上調用多個方法相關的線程安全問題。

我的問題是什麼是最好的設計模式來處理這種情況,而不是直接調用單例方法?我相信我需要以某種方式使用JobDataMap,但我不知道如何。我應該看看生產者 - 消費者還是排隊方法?

回答

1

您可能想要考慮實施將服務層對象注入作業的自定義作業工廠。現在已經有了最流行的DI容器的自定義工廠的實現,所以你可以選擇其中的一個或者建立你自己的。這將允許您在每次創建作業時傳遞對服務層對象的引用,並應該幫助進行單元測試。它也將解決單身問題。

就擴展而言,您可以使用JobDataMap傳入連接字符串或服務器名稱等內容,從而允許您在服務器之間進行負載平衡或分配工作。

這裏有一些posts描述了自定義作業工廠的方法,如果你最終走下去的路徑。

+0

這聽起來像沒有辦法做到這一點,而不使用依賴注入? – sdbol 2012-08-12 11:47:14

+0

是否將服務層轉換爲類似Web服務的選項?那麼你只需要傳遞給它的URL。除此之外,我認爲DI是要走的路。 – jvilalta 2012-08-12 18:22:53