在MVC中,后台任务的代码在哪里?

时间:2010-12-18 03:56:03

标签: model-view-controller asp.net-mvc-2 semantics project-organization

我正在使用ASP.NET,但我确信这适用于任何(或大多数)MVC框架。

创建新的Web项目时,您将获得代码的基本文件夹/语义结构:

  • 控制器(来自浏览器的服务请求)
  • 模型(存储和操作数据)
  • 观看次数(HTML页面)
  • 内容(静态内容
  • 脚本(JavaScript)
  • App_Data(数据库文件)

没关系,但如果我想让代码分别运行浏览器请求,那该怎么办?例如,请求可能运行一些代码,但是在另一个线程中,并在请求后继续执行完成了。或者,如果代码只是独立于请求而定期运行。

就我而言,代码可以处理数据 - 生成数据,清理数据等 - 这让我觉得它应该放在模型中。但它并没有真正“模拟”数据,它只是在后台工作。这种事情有语义上的位置吗?

1 个答案:

答案 0 :(得分:1)

您可以在此处使用队列,例如MSMQ,RabbitMQ等。每个需要卸载的请求都可以排队,外部服务会从队列中弹出项目并逐个开始处理它们。服务本身可以是普通的Windows服务,尽管你可以在这里使用WCF。您甚至可以将工作流集成到更复杂的处理场景中。我通常为这些类型的项目创建一个名为“services.servicename”的独立命名空间。

编辑: 你可能在这里看两个部分。要使这样的工作起作用,您需要一个服务来从您的应用程序获取请求并将它们添加到队列中。另一个实际处理队列的服务。您可能会在解决方案中查看3个不同的项目来完成此任务。现在,我之前已经使用WCF完成了这项工作,因此我的建议基于WCF技术。以下是您的项目结构的外观。

  1. MyCompany.Services.QueueRequest - 接收来自您的应用程序的请求。
  2. MyCompany.Services.QueueRequestContract - 提供一个合同(接口),允许您的应用程序与QueueRequest服务进行交互。
  3. MyCompany.Services.QueueProcessor - 后台处理器。
  4. 您的QueueRequest服务将在QueueRequestContract命名空间中实现接口而不是它自己的接口。我们这样做是为了让我们可以在您的应用程序层中重用该合同来与服务进行通信。所以它看起来像这样。

    您的应用 - > QueueRequestContract(IMyService) - > QueueRequest服务(实现IMyService)。