加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

dependency-injection – 通过依赖注入为后台任务提供DbContext

发布时间:2020-12-14 00:51:33 所属栏目:百科 来源:网络整理
导读:我可能没想到正确的方向.我是Dependency Injection和ASP.Net Core的新手. 我有一个ASP.Net核心网站,其中一个任务是将数据从Excel工作表导入用户将上传的数据库. excel表格可能很大,数据转换任务需要时间,因此我希望在后台执行它们.即用户将上传工作表,响应将
我可能没想到正确的方向.我是Dependency Injection和ASP.Net Core的新手.

我有一个ASP.Net核心网站,其中一个任务是将数据从Excel工作表导入用户将上传的数据库. excel表格可能很大,数据转换任务需要时间,因此我希望在后台执行它们.即用户将上传工作表,响应将立即发送,后台作业/线程将导入数据.

我试图通过以下方式运行后台工作:

Task.Run(() => ProcessImport(model));

我遇到的问题是Process导入方法调用具有存储库类的服务,该存储库类通过作为Scoped添加的ASP.Net依赖注入容器访问AppDbContext,并且一旦响应被发回,则处理上下文.我得到一个运行时异常,你不能在它被处置后使用上下文.

我的问题是,处理这种情况的最佳方法是什么?我应该制作AppDbContext单例吗?我应该在ProcessImport方法中创建一个新的AppDbContext实例,并将其传递给它吗?我读过DbContext不是线程安全的,所以这是一个好方法吗?

您应该将IServiceScopeFactory实例(它的单例)传递给您的任务.

在内部任务中,当数据到达时,您应该创建新的CreateScope()并从该范围请求服务.当数据处理完成时 – 处置此范围(但是对下一次运行保持对IServiceScopeFactory的引用).

例如,请参见this.我用这个库运行小而快的任务.

对于重型/长期运行的任务,正如Gert所写,不要依赖于您的任务将始终运行完成.准备好重新启动,准备好重新处理相同的数据.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读