Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.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
Asp.net mvc 如何在ASP.NET MVC中首先使用EF代码上的UnitOfWorkPattern实现Quartz.NET作业_Asp.net Mvc_Entity Framework_Ef Code First_Quartz Scheduler_Quartz.net - Fatal编程技术网

Asp.net mvc 如何在ASP.NET MVC中首先使用EF代码上的UnitOfWorkPattern实现Quartz.NET作业

Asp.net mvc 如何在ASP.NET MVC中首先使用EF代码上的UnitOfWorkPattern实现Quartz.NET作业,asp.net-mvc,entity-framework,ef-code-first,quartz-scheduler,quartz.net,Asp.net Mvc,Entity Framework,Ef Code First,Quartz Scheduler,Quartz.net,我有ASP.NET MVC 3.0应用程序,其中EF代码首先用于数据层。我已经实现了一个工作单元模式,我正在HttpContext.Current.Items[SomeKey]集合上绑定工作单元的上下文。工作单元在控制器上的OnActionExecuting/Executed事件中创建和提交。我正在使用Windsor Castle实例化存储库 现在我需要使用Quartz.net在我的应用程序中定期运行作业,此作业还需要使用很少的存储库。问题是,在SchedulerJob实现中,没有可用的Http

我有ASP.NET MVC 3.0应用程序,其中EF代码首先用于数据层。我已经实现了一个工作单元模式,我正在HttpContext.Current.Items[SomeKey]集合上绑定工作单元的上下文。工作单元在控制器上的OnActionExecuting/Executed事件中创建和提交。我正在使用Windsor Castle实例化存储库


现在我需要使用Quartz.net在我的应用程序中定期运行作业,此作业还需要使用很少的存储库。问题是,在SchedulerJob实现中,没有可用的HttpContext(事实上)。在这种情况下,如何从Quartz.net作业实例化存储库(以UnitOfWorkFactory作为构造函数参数)?如何替换缺少的HttpContext?我可能需要实现另一个UnitOfWorkFactory,但我不确定在哪里可以绑定上下文,以及如何仅为Quartz.net线程注册不同的工厂。你能给我指一条路或图案吗?谢谢。

工作单元实现属于业务逻辑层,不应依赖于特定的表示层,如MVC


我在两个项目中使用了一个自定义UNITOFF工作范围:

。您可能需要考虑编写自己的作业工厂并在那里注入您的存储库。我写了一篇关于如何做到这一点的帖子。Windsor还具有直接集成Quartz.net的功能


最后一点评论。。。如果要安排长时间运行的作业,或者要安排定期运行的作业,则不应在web应用程序中托管Quartz.Net。IIS进程回收将无法使计划程序正常运行。windows服务是一个不错的选择。

我同意你的说法,即工作单元不应该依赖于UI层。我读了您的文章,但从中看不到如何将您的方法与存储库模式和DI结合起来。我希望DI将存储库(或外观)的实例注入到我的控制器中。那么,如何让存储库知道当前UnitOfWorkScope?它的工作原理类似于TransactionScope。只需在存储库中创建一个新的UOW,它将使用gäller打开的UOW的DbContext。它处理DI,但也提供处理保存(或不保存)的投票权。对于一个存储库来说,这似乎是可以的,但是如果我需要在多个存储库上执行一个复杂的操作(很少调用几个不同的存储库),并且我想在一个范围内执行这个复杂的操作,该怎么办?我还注意到,您使用的是私有ThreadStatic变量(scopedDbContext),这种方法在ASP MVC中安全吗?我使用HttpContext.Current.Items集合来存储上下文,因为它是每个HTTP请求的唯一实例。它是否保证,服务于我的请求的线程不会切换到UNITOFWorkStudio块中间的另一个请求?为了保持对多个存储库的调用,使用同一个DbCurror,对它们的调用必须被封装在一个UWO中。我通常在操作方法中打开UOW。只要不使用线程或异步方法,所有操作都将在一个线程上运行。它可能会因为同步操作而失败。谢谢你的回答,最后我决定重构我的UOW并在不依赖HttpContext的情况下实现它。我还将删除Quertz.NET作业,并通过MSSQL作业实现其功能。感谢您的回答,我的结论是,我将删除Quartz作业,并将其功能作为MSSQL作业实现,该作业将定期触发。不幸的是,我无法在服务器上安装windows服务,因为它是一个商业web托管服务器,管理员不允许在其上安装任何自定义内容。