Model view controller 在MVC中,后台任务的代码属于哪里?

Model view controller 在MVC中,后台任务的代码属于哪里?,model-view-controller,asp.net-mvc-2,semantics,project-organization,Model View Controller,Asp.net Mvc 2,Semantics,Project Organization,我使用的是ASP.NET,但我确信这适用于任何(或大多数)MVC框架 创建新的web项目时,您将获得代码的基本文件夹/语义结构: 控制器(来自浏览器的服务请求) 模型(存储和操作数据) 视图(HTML页面) 内容(静态内容) 脚本(JavaScript) 应用程序数据(数据库文件) 这很好,但是如果我想让代码与浏览器请求分开运行——例如,可能一个请求运行一些代码,但在另一个线程中,并在请求完成后继续执行。或者如果代码只是周期性地独立于请求运行,该怎么办 在我的例子中,代码可以处理数据——生成

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

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

  • 控制器(来自浏览器的服务请求)
  • 模型(存储和操作数据)
  • 视图(HTML页面)
  • 内容(静态内容)
  • 脚本(JavaScript)
  • 应用程序数据(数据库文件)
这很好,但是如果我想让代码与浏览器请求分开运行——例如,可能一个请求运行一些代码,但在另一个线程中,并在请求完成后继续执行。或者如果代码只是周期性地独立于请求运行,该怎么办


在我的例子中,代码可以处理数据——生成数据,清理数据,等等——这让我觉得它应该放在模型中。但它不是真正的“模型”数据,它只是在后台工作。这类东西有语义位置吗?

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

编辑: 您可能会在这里看到两个部分。要使类似的功能发挥作用,您需要一个服务来接收应用程序的请求并将它们添加到队列中。还有另一个服务来实际处理队列。您可能会在解决方案中看到三个不同的项目来实现这一点。现在,我以前已经使用WCF完成了这项工作,因此我的建议是ns基于WCF技术。以下是您的项目结构的外观

  • MyCompany.Services.QueueRequest-从应用程序接收请求
  • MyCompany.Services.QueueRequestContract-提供一个合同(接口),允许应用程序与QueueRequest服务接口
  • MyCompany.Services.QueueProcessor-后台处理器
  • 您的QueueRequest服务将在QueueRequestContract命名空间中实现接口,而不是在其自己的命名空间中实现接口。我们这样做是为了可以在您的应用程序层中重用该契约来与服务通信。因此,它看起来有点像这样


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

    您可以在此处使用队列,如MSMQ、RabbitMQ等。每个需要卸载的请求都可以排队,外部服务将从队列中弹出项目并开始逐个处理。该服务本身可以是一个普通的windows服务,尽管您可能在此处使用WCF。您甚至可以集成工作流int我通常为这些类型的项目创建一个称为“services.servicename”的单独名称空间

    编辑: 您可能会在这里看到两个部分。要使类似的功能发挥作用,您需要一个服务来接收应用程序的请求并将它们添加到队列中。还有另一个服务来实际处理队列。您可能会在解决方案中看到三个不同的项目来实现这一点。现在,我以前已经使用WCF完成了这项工作,因此我的建议是ns基于WCF技术。以下是您的项目结构的外观

  • MyCompany.Services.QueueRequest-从应用程序接收请求
  • MyCompany.Services.QueueRequestContract-提供一个合同(接口),允许应用程序与QueueRequest服务接口
  • MyCompany.Services.QueueProcessor-后台处理器
  • 您的QueueRequest服务将在QueueRequestContract命名空间中实现接口,而不是在其自己的命名空间中实现接口。我们这样做是为了可以在您的应用程序层中重用该契约来与服务通信。因此,它看起来有点像这样


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

    在一个单独的进程中,通过MQ连接。@Ignacio也单独创建了一个项目?另外--请原谅,我今天刚开始学习C#和ASP.NET…MQ是什么?我对“项目”一无所知;我在.NET中什么都不做。在一个单独的进程中,通过MQ连接。@Ignacio也单独做一个项目吗?另外--请原谅,我今天才开始学习C#和ASP.NET…MQ是什么?我对“项目”一点都不了解;我什么都不做.NET。很酷,谢谢。这类事情在项目结构中会出现在哪里?很酷,谢谢。这类事情在项目结构中会出现在哪里?