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 控制器中包含以上几行,

语法object sender, DoWorkEventArgs e让我想起了旧的 ASP.NET Web 应用程序。

所以我的问题是:这样做会破坏任何模式吗?在 MVC 中这样做是否合法?

4

2 回答 2

2

这样做会破坏任何模式吗?

是的,它打破了 MVC 模式。您呈现代码的方式在 MVC 中不是一个好主意。在 MVC 中,您需要分离模型视图和控制器

模型包含业务逻辑和数据逻辑,但在您的情况下,您已经在控制器中编写了业务逻辑。它会给出输出。

但实时维护起来很困难。

因此,将业务逻辑分离到一个模型中并在控制器中访问它。

于 2013-07-12T15:17:54.670 回答
1

我不知道它违反了规则,但我更喜欢更健壮的设计,特别是如果你做了很多后台操作。即,将任何后台任务分离到“实时”Web 应用程序以外的进程中。

  1. Web 应用程序只是将任务(在本例中为 SendEmailTask​​)排队到后台任务队列中,例如名为 BackgroundTasks 的数据库表。
  2. 托管在诸如 Windows 服务之类的东西中的任务处理器周期性地轮询任务队列并处理未完成的任务。

这提供了

  1. 降低了 Web 应用程序响应用户输入缓慢的风险。
  2. 对系统运行的控制和可见性(队列可以是所发生事件的记录)。
  3. 能够以透明方式或根据需要手动重试失败的任务。
  4. 分配任务处理的能力。

Windows 提供了排队功能(这个名字我暂时忘记了),但处理 IMO 有点尴尬。我更喜欢使用简单的数据库表来实现队列。例如,您可以使用 XML 将任务消息编码到列中。任务处理服务可用于所有类型的任务,而不仅仅是电子邮件。例如,您可能需要一项任务,在您的 WMS 系统将商品标记为已发货后对 CC 交易进行后授权。

于 2013-07-12T16:04:56.490 回答