Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将长时间运行的任务从MVC Web App迁移到WebJob会引用相同的项目和代码重用_C#_Asp.net Mvc_Azure_Autofac_Azure Webjobs - Fatal编程技术网

C# 将长时间运行的任务从MVC Web App迁移到WebJob会引用相同的项目和代码重用

C# 将长时间运行的任务从MVC Web App迁移到WebJob会引用相同的项目和代码重用,c#,asp.net-mvc,azure,autofac,azure-webjobs,C#,Asp.net Mvc,Azure,Autofac,Azure Webjobs,我是WebJobs新手,我需要在现有的MVC Web应用程序(托管在Azure中)中添加一个,以处理长时间运行的任务。长时间运行的任务正在执行一个ETL类型的过程,在该过程中,它调用多个外部web服务来通过SOAP/XML检索数据,将该数据保存到SQL db,然后转换数据并将保存的数据加载回数据库。此过程可能需要20-30分钟才能端到端运行 我最初让web应用程序负责启动和处理长时间运行的任务,但意识到这不太好,因此决定将此过程转移到WebJob。有道理吗 长时间运行任务的大部分逻辑都存在于服务

我是WebJobs新手,我需要在现有的MVC Web应用程序(托管在Azure中)中添加一个,以处理长时间运行的任务。长时间运行的任务正在执行一个ETL类型的过程,在该过程中,它调用多个外部web服务来通过SOAP/XML检索数据,将该数据保存到SQL db,然后转换数据并将保存的数据加载回数据库。此过程可能需要20-30分钟才能端到端运行

我最初让web应用程序负责启动和处理长时间运行的任务,但意识到这不太好,因此决定将此过程转移到WebJob。有道理吗

长时间运行任务的大部分逻辑都存在于服务层中,web应用程序中的控制器操作负责“启动”任务

该web应用程序正在使用Autofac进行DI


在不必在WebJob应用程序中复制代码的情况下,从web应用程序共享/重新使用现有Autofac配置的最佳方式是什么?i、 e.WebJob是否可以/应该引用MVC web app项目?

我想知道您是否仍在实际解耦流程-很难从您的描述中分辨出来。当你说控制器“启动”任务时——这是怎么发生的?您可能需要做的是让控制器在存储队列上创建一条新消息,并在同一队列上收到新消息时触发webjob。这是解耦层的“标准”方法。webjobs api为存储队列内置了绑定。至于服务层的体系结构,如果您构建应用程序(web应用程序和web作业),以便它们使用接口调用服务层,并且接口和服务在单独的程序集/dll中实现,然后,它应该可以很好地与任何DI容器工具(如Autofaq)配合使用——尽管它与流程托管服务的方式并不相关

流程1:Web应用->使用IJobService.CreateJob()->将消息放入存储队列


流程2:Web作业[Trigger from Storage queue]->使用IJobService.Process()->更新sql db

我想知道您是否仍在实际解耦流程-很难从您的描述中分辨出来。当你说控制器“启动”任务时——这是怎么发生的?您可能需要做的是让控制器在存储队列上创建一条新消息,并在同一队列上收到新消息时触发webjob。这是解耦层的“标准”方法。webjobs api为存储队列内置了绑定。至于服务层的体系结构,如果您构建应用程序(web应用程序和web作业),以便它们使用接口调用服务层,并且接口和服务在单独的程序集/dll中实现,然后,它应该可以很好地与任何DI容器工具(如Autofaq)配合使用——尽管它与流程托管服务的方式并不相关

流程1:Web应用->使用IJobService.CreateJob()->将消息放入存储队列


进程2:Web作业[从存储队列触发]->使用IJobService.Process()->更新sql db

如果使用Autofac,则可以创建可重用的模块。将DI注册放在单独的程序集中,并从MVC和webjob引用它。也就是说,我认为您不应该重复使用DI注册,DI是应用程序配置。此外,我非常确定您的所有注册都将具有不同的作用域,因此您将无法重用任何东西或少数东西。此外,Webjob还公开了一个IJobActivator,它可以实现注入依赖项的技巧。如果您使用Autofac,您可以创建可重用的模块。将DI注册放在单独的程序集中,并从MVC和webjob引用它。也就是说,我认为您不应该重复使用DI注册,DI是应用程序配置。此外,我非常确定您的所有注册都将具有不同的作用域,因此您将无法重用任何东西或很少的东西