dependency-injection - 通过依赖注入(inject)实现后台任务的 DbContext

标签 dependency-injection asp.net-core asp.net-core-mvc background-process entity-framework-core

我可能没有朝着正确的方向思考。我对依赖注入(inject)和 ASP.Net Core 相当陌生。
我有一个 ASP.Net 核心网站,其中一项任务是将数据从 Excel 工作表导入用户将上传的数据库。 excel表格可能很大,数据转换任务很耗时,因此我希望在后台执行它们。即用户将上传工作表,将立即发送响应,后台作业/线程将导入数据。
我正在尝试通过以下方式运行后台作业:

Task.Run(() => ProcessImport(model));
我遇到的问题是 Process 导入方法调用具有存储库类的服务,这些服务通过作为 Scoped 添加的 ASP.Net Dependency Injection Container 访问 AppDbContext ,并且一旦发送回响应,上下文就会被处理掉。我收到一个运行时异常,您在处理完上下文后无法使用它。
我的问题是,处理这种情况的最佳方法是什么?我应该使 AppDbContext 单例吗?我应该在 ProcessImport 方法中创建一个新的 AppDbContext 实例并将其传递吗?我读过 DbContext 不是线程安全的,那么这是一个好方法吗?

最佳答案

你应该通过 IServiceScopeFactory实例(它是单例)到您的任务中。

内部任务,当数据到达时,您应该创建新的CreateScope()并从该范围请求服务。当数据处理完成时 - 处理这个范围(但保留对 IServiceScopeFactory 的引用以供下次运行)。

this例如。我用这个库运行小而快的任务。

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

关于dependency-injection - 通过依赖注入(inject)实现后台任务的 DbContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39109234/

相关文章:

symfony - 如何将嵌套参数值传递给 Symfony2 中的服务

objective-c - OCMockito - 带有 "willReturn"的模拟类返回 nil 而不是我指定的值

asp.net-core - 使用Moq进行ASP.NET核心集成测试和模拟

visual-studio-2015 - Web Essentials浏览器链接在Visual Studio 2015中不适用于仅ASP.net 5应用程序

ssl - asp.net core 将 http 流量重定向到 https 问题

java - Spring中的bean实例化和依赖注入(inject)

java - 使用 Guice 注入(inject)通用接口(interface)子类型的实现

asp.net-core - 当我在内部使用 Noda Time Instant 时,我应该在 DTO 中使用什么数据类型?

asp.net-core - 使用新的 VSO 构建代理为 vNext 应用程序设置 CD

asp.net-core - 如何让 GitVersion/UpdateAssemblyInfo 与 ASP.NET Core 2.0 项目一起使用