如何使用 Autofac 注入相同的 DbContext 实例来处理 HTTP 请求而不会导致并发问题?

Posted

技术标签:

【中文标题】如何使用 Autofac 注入相同的 DbContext 实例来处理 HTTP 请求而不会导致并发问题?【英文标题】:How to use Autofac to inject the same instance of DbContext for processing an HTTP request without causing concurrency issues? 【发布时间】:2019-08-22 19:33:57 【问题描述】:

我正在使用 Autofac 和 Entity Framework 开发一个 ASP.net Web API 应用程序。

我一直将不同的服务类分解成更小的类,以使我的代码更易于测试并使我的代码更可靠。

我正在使用 Autofac 将 Entity Framework DbContext 注入到我的各种帮助类中。这会成为问题,因为如果我在两个不同的帮助器类中使用从 DbContext 查询的实体,当 Entity Framework 尝试生成查询时会出现错误。

错误表明 Entity Framework 无法使用来自两个不同 DbContext 实例的实体生成查询。

显然,解决方案是我需要配置 Autofac 以便将相同的 DbContext 实例注入到每个帮助程序类中,但我担心如果我尝试这样做,我可能会遇到并发问题应用程序被部署到生产环境中,许多人同时使用它。

如何配置 Autofac,以便当请求到达我的应用程序时,我的 API 帮助程序类都获得相同的 DbContext 实例,但在多个请求之间不会出现并发问题?

【问题讨论】:

已经有一段时间了,但这是我们在帮助程序中使用的代码:var context = (ApplicationDbContext)DependencyResolver.Current.GetService(typeof(ApplicationDbContext)); 错过了“Web API”这一点...来自@autofaccn.readthedocs.io/en/latest/faq/… 的文档,请参阅“Web API 中没有每个请求的过滤器依赖项”以获取解释。 【参考方案1】:

Autofac 文档 (https://autofaccn.readthedocs.io/en/latest/faq/per-request-scope.html#no-per-request-filter-dependencies-in-web-api) 推荐的操作过滤器的替代方法请参阅:“Web API 中没有按请求过滤器依赖项”并手动转到其他人的 DependencyResolver:

您可以查看 Medhime DbContextScope 工作单元提供程序。 (https://www.nuget.org/packages/EntityFramework.DbContextScope/) 为 EF6 和 EF Core 编译。

为您的类注入的依赖项成为顶层的 DbContextScopeFactory,以及您的服务的 AmbientDbContextLocator。这些不会“破坏” Web API 对请求生命周期范围的限制。 ContextScopeFactory 将被初始化一次并提供 DbContext,而定位器将被提供给该单个实例。

如果管理跨服务的上下文引用和 API 操作被证明很笨重,可能值得一看。

【讨论】:

以上是关于如何使用 Autofac 注入相同的 DbContext 实例来处理 HTTP 请求而不会导致并发问题?的主要内容,如果未能解决你的问题,请参考以下文章

如何运用AutoFac在WebAPI中注入多个接口

如何使用autofac实现多个DbContext的注入

如何在C#中使用具有存储库模式的依赖注入(AutoFac)

依赖注入容器-- Autofac

AutoFac

IOC容器-Autofac在MVC中实现json方式注入使用