5

我的服务器上有一些长时间运行的任务。基本上它们就像计划任务——它们不时运行。

他们都需要访问数据库,我为此使用实体框架。每个任务都使用 DbContext 进行访问。

应该在每次运行时重新创建 DbContext 对象还是应该重用它?

4

2 回答 2

6

我应该说“这取决于”,因为可能存在两个答案都有效的情况,但是最合理的答案是“应该在不需要时立即处理上下文”,这实际上意味着“尽早处理”。

这样的答案带来的风险是,新手有时会得出结论认为上下文应该尽可能地处理,这有时会导致我审查的代码中有连续的“使用”创建上下文,将其用于一两个操作, dispose 然后下一行出现另一个上下文。这当然也不推荐。

对于 Web 应用程序,自然生命周期与 Web 请求的生命周期相关联。在系统服务/其他长期运行的应用程序的情况下,生命周期策略之一是“每个业务流程实例”/“每个用例实例”,其中业务处理/用例实现定义了自然边界,其中单独的上下文实例是有意义的。

于 2013-09-22T19:46:07.597 回答
1

是的,DbContext应该只存在很短的时间。它实际上是您的工作单元

您绝对应该在每次使用它时创建它。(嗯,你应该注入它,但这是另一个讨论:-))


更新:好的,我接受“每次你要使用它时创建它”可能会产生误导。我已经习惯于上下文作为注入的类上的一个实例,因此只为请求的生命而存在,我很难以任何其他方式思考它......@wiktor 的答案肯定更好,因为它更正确地表达了您应该“尽早处置”的想法

于 2013-09-22T19:41:26.937 回答