2013-07-12 70 views
1
public ActionResult Index() 
{  
    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(Domail); 
    bw.RunWorkerAsync(); 
    Return View(); 
} 

private void Domail(object sender, DoWorkEventArgs e) 
{ 
    MyStaticClassToSendMail.MailIt(); 
} 

我計劃在我的MVC控制器上面的紋路,的BackgroundWorker在MVC模式

語法object sender, DoWorkEventArgs e提醒老ASP.NET Web應用程序的我。

所以我在這裏的問題是:做這個打破任何模式?在MVC中做合法嗎?

+0

當你有一個smtp故障時,這可能會阻止很長一段時間。您是否嘗試過使用AsyncController併爲郵件客戶端使用異步調用?這樣,您可以更輕鬆地爲異步操作定義超時並處理直接發送的結果。 – Silvermind

+0

在MVC中這不是非法的,但它應該是。 Backgroundworker被設計爲與Dispatcher合作,MVC中沒有。 –

回答

2

做這個打破任何模式?

是的,它打破了MVC模式。 您提交代碼的方式在MVC中不是一個好主意。 在MVC中,您需要分離模型視圖和控制器

模型既包含業務邏輯也包含數據邏輯,但在您的情況下,您已在控制器中編寫業務邏輯。它會給出輸出。

但實時難以維護。

因此將業務邏輯分離成模型並在控制器中進行訪問。

1

我不知道它打破了規則,但我更喜歡更強大的設計,特別是如果你做了很多後臺操作。即,將任何後臺任務分離到除「實時」Web應用程序之外的進程中。

  1. Web應用程序只需排隊(在這種情況下,SendEmailTask​​)到後臺任務隊列,任務如數據庫表名爲BackgroundTasks。
  2. 託管在諸如Windows服務之類的任務處理器週期性地輪詢任務隊列並處理未完成的任務。

這提供

  1. 降低風險的Web應用程序將是緩慢的響應用戶的輸入。
  2. 對系統功能的控制和可視性(隊列可以記錄發生的情況)。
  3. 能夠透明地或根據需要手動重試失敗的任務。
  4. 分配任務處理的能力。

Windows提供了排隊功能(這個名字此刻逃脫了我),但是與處理IMO有些尷尬。我更喜歡使用簡單的數據庫表來實現我的隊列。例如,您可以使用XML將任務消息編碼到列中。任務處理服務可用於所有類型的任務,而不僅僅是電子郵件。例如,您可能需要一個任務,在您的WMS系統將某個商品標記爲已發貨之後,對該交易進行後授權。