1

I'm using ASP.NET, but I'm sure this pertains to any (or most) MVC frameworks.

When a new web project is created, you get a basic folder/semantic structure for your code:

  • Controllers (service requests from browsers)
  • Models (store and manipulate data)
  • Views (HTML pages)
  • Content (static content
  • Scripts (JavaScript)
  • App_Data (database files)

That's fine, but what if I want to have code that runs separately of browser requests -- for example, maybe a request runs some code, but in another thread, and continues executing after the request is completed. Or if the code is just run periodically independent of a request altogether.

In my case, the code would work on data -- generating it, cleaning it up, etc -- which makes me think it should go in models. But it doesn't really "model" data, it just works on it in the background. Is there a semantic place for this kind of thing?

4

1 回答 1

1

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

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

  1. MyCompany.Services.QueueRequest - 接受来自您的应用程序的请求。
  2. MyCompany.Services.QueueRequestContract - 提供一个合同(接口),允许您的应用程序与您的 QueueRequest 服务进行交互。
  3. MyCompany.Services.QueueProcessor - 后台处理器。

您的 QueueRequest 服务将在 QueueRequestContract 命名空间中实现接口,而不是它自己的。我们这样做是为了在您的应用程序层中重用该合同以与服务进行通信。所以它看起来像这样。

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

于 2010-12-18T04:47:11.983 回答