如何使用Autofac注入同一个DbContext实例来处理HTTP请求而不会引起并发问题?

时间:2019-04-01 15:16:23

标签: entity-framework entity-framework-6 autofac dbcontext

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

我一直在将我的服务类划分成较小的类,以使我的代码更具可测试性,并使我的代码更可靠。

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

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

很明显,解决方案是我需要配置Autofac,以便将相同的DbContext实例注入到每个帮助器类中,但是如果这样做,恐怕我可能会遇到并发问题该应用程序已部署到生产环境中,许多人一次使用它。

如何配置Autofac,以便当请求到达我的应用程序时,我的API帮助器类都获得相同的DbContext实例,但是在多个请求中没有并发问题?

1 个答案:

答案 0 :(得分:0)

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操作显得笨拙。