3

我有ASP.NET MVC 3.0應用程序,EF Code First用於數據層。我已經實現了一個工作單元模式,我綁定了HttpContext.Current.Items [SomeKey]集合上的工作單元的上下文。工作單元在控制器上的OnActionExecuting/Executed事件中創建並提交。我正在使用溫莎城堡實例化存儲庫。如何使用UnitOfWorkPattern在EF代碼優先的ASP.NET MVC中實現Quartz.NET作業

現在我需要使用Quartz.net在我的應用程序中定期運行一個作業,這項工作也需要使用少量的存儲庫。問題是,在SchedulerJob實現中,沒有可用的HttpContext(實際上)。在這種情況下,如何從Quartz.net Job實例化一個存儲庫(它將UnitOfWorkFactory作爲構造參數)?我該如何替換丟失的HttpContext?我可能需要實現另一個UnitOfWorkFactory,但我不確定在哪裏可以綁定我的上下文,以及如何爲Quartz.net線程註冊不同的工廠。你能告訴我一種方式或模式嗎?謝謝。

回答

0

工作單元實現屬於業務邏輯層,不應該依賴於特定的表示層,如MVC。

我做了一個自定義的UnitOfWorkScope,我已經在幾個項目中使用:http://coding.abel.nu/2012/10/make-the-dbcontext-ambient-with-unitofworkscope/

+0

我同意你的說法,即工作單元不應該依賴UI層。我讀過你的文章,但是我無法從中看到,如何將你的方法與存儲庫模式和DI結合起來。我想通過DI注入存儲庫(或外牆)的實例到我的控制器中。那麼如何讓知識庫知道當前的UnitOfWorkScope? – Mikee 2013-04-20 18:03:41

+0

它與TransactionScope類似。只需在存儲庫中創建一個新的UOW,它將使用由gäller打開的UOW的DbContext。它處理DI,但也提供處理保存(或不)的投票。 – 2013-04-20 18:53:10

+0

對於一個存儲庫來說似乎沒問題,但是如果我需要在更多存儲庫上執行復雜操作(對少數幾個不同存儲庫的調用很少),並且我希望在一個範圍內執行此複雜操作?我也注意到,你正在使用一個私有的ThreadStatic變量(scopedDbContext),這種方法在ASP MVC中安全嗎?我使用HttpContext.Current.Items集合來存儲上下文,因爲它是每個HTTP請求的唯一實例。是否保證,爲我的請求提供服務的線程將不會切換到UnitOfWorkScope塊中間的另一個請求? – Mikee 2013-04-20 19:16:17

1

你可能要考慮編寫自己的工作的工廠和注入你的倉庫那裏。我寫了一篇關於如何做到這一點的文章here。溫莎也有一個facitlity直接集成Quartz.net。

最後一條評論...如果您要安排長時間運行的作業或者要安排作業定期運行,則不應在您的Web應用程序中放置Quartz.Net。 IIS進程回收不會讓您的調度程序正常運行。一個Windows服務是要走的路。

+0

感謝您的回答,我得出結論:我將刪除Quartz作業並將其作爲MSSQL作業執行,並定期觸發。不幸的是,我不能在服務器上安裝Windows服務,因爲它是一個商業網站託管服務器,管理員不會允許安裝任何自定義的服務。 – Mikee 2013-04-21 09:08:56